Fork me on GitHub

我的教师专业发展学习心得(自用)

教师专业发展结课作业

教师专业发展的节课作业是一篇3000字的学习心得,12月31日晚9点前交给老师。

三千字对于一门课的学习心得来说并不多,难点在于组织文章的结构,如果文章的结构确定了,剩下来的填写内容部分就简单很多了。

文章的内容结构

经过我的分析文章结构分为

  • 认清身份 (认清教师的身份与角色)
  • 找准方向 (教师需要在 文化常识、教学方法、专业课三个方面进行不断地提升)
  • 螺旋式前进 (有动力、找到发展动力的内因和外因以及他们的作用、实验、总结、调整、再实验的学习过程)

三个方面,三方面包含的主要内容已经说明,大概就是围绕这几点来写。

认清身份

讲一点身份认同

教师应该能够认清自己的身份与角色。

当提到教师我就会想到“教书育人”一词,教师不仅要教好书,还要育好人。

必须要认清,教师也是学习者,需要不断地学习

教师职业的要求

1
教师角色 角色要求. 教师角色体现着社会期望年轻一代成为继承、发扬年长一代的事业的人才。. “育人”是它的行为的基本准则。. 履行这一准则者,才具有这一身份,居有这一位置。. 凡具有这一身份者,无论他对其身份的理解如何,都在一定的程度上,照此准则行事。. 随着他对社会的上述期望的认同程度的加深,他“以身作则,为人师表,诲人不倦,期望学生成才”的基本心理特征就更为明显。. 这认同程度与其“育人”实践的广度、深度成正相关。. 具有此身份者,在其他的社会关系的位置上,又有另外的身份,如父 (母)、兄 (姐)、朋友,等等。. 但他作为教师,对于学生,始终是个“育人”角色。.
1
2
教师角色指社会对教师职能和地位的期望和要求。它规定了教师在教育情境中所应该表现的心理和行为方式。角色主要包括知识的传播者和创造者,学习的促进者、教学的设计者、家长的代言人、社会规范的象征者以及人际关系的协调者等。 [1] 
从另一个角度也可以理解为:教师在社会关系中的一种位置,因社会分工而具有对年轻一代传授科学文化知识、培养思想情操和行为习惯者的身份。 [2]

育好人

1
我国的教育目的: 培养德、智、体等方面全面发展的社会主义事业的“建设者和接班人”。

爱国主义教育

1
2
爱国主义教育是指树立热爱祖国并为之献身的思想教育。爱国主义教育是思想政治教育的重要内容。爱国主义是一面具有最大号召力的旗帜,是中华民族的优良传统。中国爱国主义教育的特点是:艰苦奋斗、辛勤劳动,不断丰富和发展中华民族的物质文化财富;反对民族分裂 和国家分裂,维护各民族的联合、团结和国家的统一;在外敌入侵面前,团结对外,英勇抵抗,维护祖国的主权和独立;同一切阻碍历史发展和社会进步的势力和制度进行斗争,推动祖国的繁荣和进步。
当代中国,爱国主义的本质就是坚持爱国和爱党、爱社会主义高度统一。 [1]

找准方向

教师需要在文化常识,教育知识,专业课三方面不断提升。

文化常识

讲讲德育吧,这是我们这个时代需要的,爱国主义教育需要文化常识

教育知识

教育知识应当包括教学方法和教育理念

教育方法

1
2
教育方法是指在一定的教育思想指导下形成的实现其教育思想的策略性途径。包括教师直接指向教育内容的教学方法、学生学习方法指导及学前教育和家庭教育的方法。
教育方法是教育的客观规律和原则的反映和具体体现,正确地运用各种教育方法,对提高教学质量,实现教育目的,完成教育任务具有重要的意义。

教育理念

1
教育理念,即关于教育方法的观念,是教育主体在教学实践及教育思维活动中形成的对“教育应然”的理性认识和主观要求,包括教育宗旨、教育使命、教育目的、教育理想、教育目标、教育要求、教育原则等内容。

专业课

以计算机为例,以高中信息技术为例。教师如何进行学习。

如何提升

我认为最好的方法就是加入教师学习共同体,(给出教师学习共同体的概念),(教师学习共同体的作用),(抄几段教师学习共同体的作用),(教师学习共同体需要注意的点)

全过程民主

1
全过程民主包括民主选举、民主决策、民主管理、民主监督等过程。

螺旋式前进

教育知识只是间接经验,

间接经验

1
人凭借书本等各种文字记载所获得的知识

直接经验

1
亲身参加变革现实的实践而获得的知识

书本上的教育方法不是教条,需要结合自己的教学环境进行改变

“实践是检验真理的唯一标准”,

2.2版本分析

2.2版本分析

2.1版本上的升级

需求

最近在读书做笔记时,想到,传统的手写笔记不容易编写,也不容易阅读。

而且受写作的人的笔迹影响很大。由于我的笔迹看着很差,但是我是不想改的,因此我想到编写一个程序用来存放我的阅读笔迹。

正好“阶梯计划”程序还有一个空闲地方没有用,因此就直接塞进这个程序吧

z3eGm6.png

这里模块虽然显示的是党章,但是这里其实只添加了一个别人的超链接,修改一下不会有影响。

编写

前端准备

首先我们应该挑选一个漂亮的前端来渲染我们的数据

z3ewpd.png

并没有在网上找到合适的页面,就自己手写吧

z3eDXt.png

大概就是这个样子 后续还会添加分页功能

前端预留的功能有:

  • 添加金句
  • 修改金句
  • 删除金句
  • 分页查询

后端准备

最简单一个测试demo

数据库准备

z3efpj.png

**表名为:fagment(片段)**列名包括

列名 意义 类型
content 金句内容 text
from 节选自 varchar
addByID 添加的管理员的ID varchar

后端框架搭建

POJO

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
package com.dwx.pojo;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@NoArgsConstructor
@AllArgsConstructor

public class Fragment {
private String content;
private String from;
private String addByID;
private String addByName;
}

Mapper

1
2
3
4
5
6
7
8
9
10
11
12
13
package com.dwx.mapper;

import com.dwx.pojo.Fragment;
import org.apache.ibatis.annotations.Mapper;

import java.util.List;

@Mapper
public interface FragmentMapper {
//查询金句操作
//首先写一个能够查询所有金句的程序试水
List<Fragment> getAllFragments();
}

前端jsp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" %>
<%@include file="/houtai/jsp/common/head.jsp" %>

<head>
<style type="text/css">
.head {
margin-left: 90%;
}
.main{
align-self: center;
/*background-color: #61CAD0;*/
/*height: auto;*/
height: 160px;
width: 60%;
margin-left: 20%;
margin-bottom: 20px;

/*设置一个边框*/
border:4px solid #eeab07;
border-radius: 10px;
}
.body{
/*background-color: #0a5eb6;*/
height: 70%;
}
.foot{
/*background-color: #2b4906;*/
height: 30%;
/*横向布局*/
display: flex;
border:2px solid #eeab07;
border-top-color: #ab1e1e;
}
.from{
/*background-color: #ab1e1e;*/
height: 100%;
width: 40%;
/*float: left;*/
}
.addBy{
/*background-color: #6A6AFF;*/
height: 100%;
width: 20%;
/*float: left;*/
margin-left: 5%;
margin-right: 5%;
}
.update{
/*background-color: #aaaaaa;*/
height: 100%;
width: 10%;
margin-left: 5%;
margin-right: 5%;
/*float: right;*/
text-align: center;
}
.delete{
/*background-color: #f6f7f9;*/
height: 100%;
width: 10%;
margin-left: 5%;
text-align: center;
/*float: right;*/
}
.p1{
font-weight: bold;
font-family: 华文楷体;
font-size: large;
}
.p2{
font-weight: bold;
font-family: "Microsoft Yahei", "Hiragino Sans GB", "Helvetica Neue", Helvetica, tahoma, arial, Verdana, sans-serif, "WenQuanYi Micro Hei", "\5B8B\4F53";
font-size: large;
}




</style>
</head>


<div class="right">
<div class="location">
<strong>你现在所在的位置是:</strong>
<span>金句节选界面</span>
</div>
<div class="head">
<form method="get" action="${pageContext.request.contextPath }/houtai/jsp/bill.do">
<input value="添加金句" type="submit" id="searchbutton">
</form>
</div>
<!--文章块-->
<c:forEach var="fragment" items="${fragments}" varStatus="status">
<div class="main">
<div class="body">
<p class ="p1">${fragment.content}
</p>
</div>
<div class="foot">
<div class="from">
<p class="p2">节选自: ${fragment.from}</p>
</div>
<div class="addBy">
<p class="p2">添加者: ${fragment.addByID}</p>
</div>
<div class="update">
<p class="p2"><a>修改</a></p>
</div>
<div class="delete">
<p class="p2"><a>删除</a></p>
</div>
</div>
</div>
</c:forEach>

</div>
</section>


<%@include file="/houtai/jsp/common/foot.jsp" %>
<script type="text/javascript" src="${pageContext.request.contextPath }/houtai/js/billlist.js"></script>

最简单的框架执行结束

z3eX9J.png

优化

查询数据需要修改

z3exj1.png

这里应该是name,不是id,在service层进行一个修改即可。

编写添加金句程序

前端准备

z3m9HK.png

我的水平 写成这样已经是我的极限了

前端代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" %>
<%@include file="/houtai/jsp/common/head.jsp" %>

<head>
<style type="text/css">
.fragmentAddBody {
height: 80%;
width: 30%;
/*background-color: #eee304;*/
/*居中*/
margin-left: 30%;
margin-top: 20px;

/*添加边框*/
border-width: 6px;
border-style: solid;
border-color: #a40505;
border-radius: 10px;

}

.fragmentAddContest {
height: 240px;
width: 90%;
margin-top: 20px;
margin-left: 5%;
background-color: #10c278;
}

.fragmentAddFrom {
height: 60px;
width: 90%;
margin-top: 8px;
margin-left: 5%;
background-color: #f6bc04;
}

.fragmentAddBtn {
height: 60px;
width: 90%;
margin-top: 8px;
margin-left: 5%;

/*background-color: #ab1e1e;*/
display: flex;

}

.save {
/*background-color: #a2d866;*/
height: 60px;
width: 40%;
margin-right: 20%;
margin-left: 5%;
margin-top: 20px;
}

.back {
/*background-color: #61CAD0;*/
height: 60px;
width: 40%;
margin-top: 20px;
}
.contest{


}




</style>
</head>


<div class="right">
<div class="location">
<strong>你现在所在的位置是:</strong>
<span>金句管理页面 >> 金句添加页面</span>
</div>


<div class="fragmentAddBody">

<!--操作按钮-->
<form method="post" action="${pageContext.request.contextPath}/fragmentAdd">

<div class="fragmentAddContest">
<p>金句片段:</p><textarea cols="46" name="fragmentContest" rows="16" class="contest"></textarea>
</div>
<div class="fragmentAddFrom">
<p>选自: </p><textarea cols="46" name="fragmentFrom" rows="3" class="from"></textarea>
</div>

<div class="fragmentAddBtn">
<div class="save">
<input style="width: 100px" type="submit" value="保存">
</div>

<div class="back">
<input style="width: 100px" type="submit" value="返回">
</div>
</div>


</form>

</div>

</div>
</section>

<%@include file="/houtai/jsp/common/foot.jsp" %>
<%--<script type="text/javascript" src="${pageContext.request.contextPath }/js/billmodify.js"></script>--%>

后端编写

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
@RequestMapping("/fragmentAdd")
public String fragmentAdd(String fragmentContest, String fragmentFrom, String type, HttpServletRequest req, HttpServletResponse resp) {

//添加一个过滤器
UserUtil util = new UserUtil();
boolean b1 = false;
try {
b1 = util.userExist(req, resp);
} catch (IOException e) {
throw new RuntimeException(e);
}
if (!b1) {
return "/error/index";
}
//首先判断类型
System.out.println("该操作的类型为: " + type);
if (type.equals("保存")) {

System.out.println("输入的金句内容是: " + fragmentContest);
System.out.println("输入的金句节选自: " + fragmentFrom);
//从session里得到用户ID
HttpSession session = req.getSession();
User user = (User) session.getAttribute("userSession");
System.out.println("添加者ID: " + user.getId());

if (!fragmentContest.equals("") && !fragmentFrom.equals("")) {
//如果都不为空 则进行添加程序
boolean b = fragmentService.addFragment(fragmentContest, fragmentFrom, user.getId());
if (b) {
System.out.println("添加金句成功");
} else {
System.out.println("添加金句失败");
}
}
return "/houtai/jsp/billadd";
} else {
//执行一个查询程序
getALlFragments(req, resp);
return "/houtai/jsp/billlist";
}

}

编写删除程序

z3miND.png

删除成功

image-20221122181527392

后端代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
//删除金句
@RequestMapping("/fragmentDelete")
public String fragmentDelete(String fragmentContent,HttpServletRequest req, HttpServletResponse resp){


System.out.println("要删除金句的内容是:"+fragmentContent);

//添加一个过滤器
UserUtil util = new UserUtil();
boolean b1 = false;
try {
b1 = util.userExist(req, resp);
} catch (IOException e) {
throw new RuntimeException(e);
}
if (!b1) {
return "/error/index";
}
//进行一个判断看能不能删除
HttpSession session = req.getSession();
User user = (User) session.getAttribute("userSession");
String id = user.getId();
System.out.println(id);
boolean b = util.userRole(req, resp, id);
if (b){
System.out.println("有资格,可以删除");
fragmentService.deleteFragment(fragmentContent);
}
else {
System.out.println("没资格删除");
}


//再次更新一下fragmentList
getALlFragments(req, resp);
return "/houtai/jsp/billlist";

}

编写修改程序

根据修改程序的逻辑,应该分为两块,

第一块,点击能够跳转到类似查看的页面:

前端编写:

z3mVgA.png

代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" %>
<%@include file="/houtai/jsp/common/head.jsp" %>

<head>
<style type="text/css">
.fragmentAddBody {
height: 80%;
width: 30%;
/*background-color: #eee304;*/
/*居中*/
margin-left: 30%;
margin-top: 20px;

/*添加边框*/
border-width: 6px;
border-style: solid;
border-color: #a40505;
border-radius: 10px;

}

.fragmentAddContest {
height: 240px;
width: 90%;
margin-top: 20px;
margin-left: 5%;
background-color: #10c278;
}

.fragmentAddFrom {
height: 60px;
width: 90%;
margin-top: 8px;
margin-left: 5%;
background-color: #f6bc04;
}

.fragmentAddBtn {
height: 60px;
width: 90%;
margin-top: 8px;
margin-left: 5%;

/*background-color: #ab1e1e;*/
display: flex;

}

.save {
/*background-color: #a2d866;*/
height: 60px;
width: 40%;
margin-right: 20%;
margin-left: 5%;
margin-top: 20px;
}

.back {
/*background-color: #61CAD0;*/
height: 60px;
width: 40%;
margin-top: 20px;
}
.contest{


}




</style>
</head>


<div class="right">
<div class="location">
<strong>你现在所在的位置是:</strong>
<span>金句管理页面 >> 金句添加页面</span>
</div>


<div class="fragmentAddBody">

<!--操作按钮-->
<form method="post" action="${pageContext.request.contextPath}">

<div class="fragmentAddContest">
<p>金句片段:</p><textarea cols="46" name="fragmentContest" rows="16" class="contest">${fragment.content}</textarea>
</div>
<div class="fragmentAddFrom">
<p>选自: </p><textarea cols="46" name="fragmentFrom" rows="3" class="from">${fragment.from}</textarea>
</div>

<div class="fragmentAddBtn">
<div class="save">
<input style="width: 100px" name="type" type="submit" value="保存">
</div>

<div class="back">
<input style="width: 100px" name="type" type="submit" value="返回">
</div>
</div>


</form>

</div>

</div>
</section>

<%@include file="/houtai/jsp/common/foot.jsp" %>
<%--<script type="text/javascript" src="${pageContext.request.contextPath }/js/billmodify.js"></script>--%>

后端代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
@RequestMapping("/fragmentUpdateView")
//修改程序分为两个 第一个是一个查询程序
public String fragmentUpdateView(int id,HttpServletRequest req, HttpServletResponse resp){

System.out.println("要修改的金句的id为: "+id);

Fragment fragment = fragmentService.getFragmentByID(id);

req.getSession().setAttribute("fragment",fragment);

return "/houtai/jsp/billmodify";

} @RequestMapping("/fragmentUpdateView")
//修改程序分为两个 第一个是一个查询程序
public String fragmentUpdateView(int id,HttpServletRequest req, HttpServletResponse resp){

System.out.println("要修改的金句的id为: "+id);

Fragment fragment = fragmentService.getFragmentByID(id);

req.getSession().setAttribute("fragment",fragment);

return "/houtai/jsp/billmodify";

}

第二个程序是保存修改结果程序

修改前:

z3muHf.png

修改之后

z3mQUS.png

后端代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
//修改金句
//修改程序
@RequestMapping("/fragmentUpdate")
public String fragmentUpdate(String content, String from, String type, HttpServletRequest req, HttpServletResponse resp) {

//用session获得id
Fragment fragmentOld = (Fragment) req.getSession().getAttribute("fragment");
int id = fragmentOld.getId();


System.out.println("要修改的金句: "+content);
System.out.println("选自: "+from);
System.out.println("操作内容: "+type);

if (type.equals("保存")) {

//修改程序
fragmentService.updateFragment(content, from, id);

//修改完更新一下程序
Fragment fragment = fragmentService.getFragmentByID(id);
req.getSession().setAttribute("fragment", fragment);
return "/houtai/jsp/billmodify";

} else {
//没有修改 直接跳转回原页面
return "/houtai/jsp/billlist";
}


}

结束

一个简单的包含增删改查程序的一个模块就写好了,不过还有遗留问题

  • 没有分页查询
  • 分页查询需要大量的数据,但是我现在还没有这些数据

第三章数据库作业

第三章数据库作业

作业要求

根据SPJ数据库,给出下列各题的命令语句,将执行的语句及结果复制到word文档中,(查询结果可复制,选中查询结果后,点击右键,在快捷菜单中选择相应选项):

针对SPJ数据库,查询S表中供应商所在城市为天津的SNO,SNAME, CITY 。

\1. 查询工程项目所在城市有哪些?

\2. 查询SPJ表中供应数量大于200的记录的SNO,PNO,JNO,QTY,分别以供应商代码,零件代码,工程项目代码,供应数量显示

\3. 查询工程项目所在城市为北京、天津、南京的工程项目信息。

\4. 查询所有名称第一个字为“螺”的零件的信息

\5. 查询第二个字为“轮”的零件的信息

\6. 查询红色且重量大于20的零件的信息

\7. 查询红色或重量大于20的零件的信息

\8. 查询工程项目所在地不为北京和天津的工程项目信息

\9. 从SPJ表中查询工程项目代码为J1的记录信息,并按照供应数量递增排序。

\10. 统计SPJ表中使用P3零件的总数量,最小数量、最多数量、平均数量

13.统计SPJ表中使用各种零件的总数量,最小数量、最多数量、平均数量

14.统计SPJ表中各工程项目分别使用了几种零件

15.统计SPJ表中各工程项目分别使用各种零件的总数量

16.查询SPJ表中使用零件种类超过两种的工程项目。

17.查询SPJ表中各供应商分别给几个项目供应零件

18.查询SPJ表中各供应商分别供应每种零件给几个项目,及供应每种零件的总数量

19.查询SPJ表中所有供应商代码,供应商姓名,零件名,工程项目名,供应数量,且供应数量>200的项目信息

20.查询所有工程项目代码,工程项目名,所在城市,及使用的各零件代码,和数量

以下使用嵌套查询实现

21.查询S1供应商供应的工程项目代码,工程项目名,所在城市

\22. 查询使用蓝色零件的项目的工程项目代码,工程项目名,所在城市

23.查询SPJ表中使用数量超过200的零件代码,零件名,颜色,

24.查询和s1在同一个城市的供应商代码,供应商名称

\25. 查询所有使用了p1零件项目代码,名称,城市(用exists查询实现)

26.查询没有使用p1零件的项目代码,名称,城市(用not exists查询)

作业分析

是简单的数据库操作的考察,sql语句的考察,题目中的SPJ表在数的课后题里,需要自己创建。

创建SPJ数据库

创建数据库代码,用的是mysql数据库 不知道sql是否和其他的数据库通用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
/*
SQLyog Professional v12.09 (64 bit)
MySQL - 8.0.26 : Database - spj
*********************************************************************
*/


/*!40101 SET NAMES utf8 */;

/*!40101 SET SQL_MODE=''*/;

/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
CREATE DATABASE /*!32312 IF NOT EXISTS*/`spj` /*!40100 DEFAULT CHARACTER SET utf8 */ /*!80016 DEFAULT ENCRYPTION='N' */;

USE `spj`;

/*Table structure for table `j` */

DROP TABLE IF EXISTS `j`;

CREATE TABLE `j` (
`JNO` varchar(4) DEFAULT NULL COMMENT '项目代码',
`JNAME` varchar(10) DEFAULT NULL COMMENT '工程项目名',
`CITY` varchar(10) DEFAULT NULL COMMENT '工程项目所在城市'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3;

/*Data for the table `j` */

insert into `j`(`JNO`,`JNAME`,`CITY`) values ('J1','三建','北京'),('J2','一汽','长春'),('J3','弹簧厂','天津'),('J4','造船厂','天津'),('J5','机车厂','唐山'),('J6','无线电厂','常州'),('J7','半导体厂','南京');

/*Table structure for table `p` */

DROP TABLE IF EXISTS `p`;

CREATE TABLE `p` (
`PNO` varchar(4) DEFAULT NULL COMMENT '零件代码',
`PNAME` varchar(10) DEFAULT NULL COMMENT '零件名',
`COLOR` varchar(10) DEFAULT NULL COMMENT '颜色',
`WEIGHT` int DEFAULT NULL COMMENT '重量'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3;

/*Data for the table `p` */

insert into `p`(`PNO`,`PNAME`,`COLOR`,`WEIGHT`) values ('P1','螺母','红',12),('P2','螺栓','绿',17),('P3','螺丝刀','蓝',14),('P4','螺丝刀','红',14),('P5','凸轮','蓝',40),('P6','齿轮','红',30);

/*Table structure for table `s` */

DROP TABLE IF EXISTS `s`;

CREATE TABLE `s` (
`SNO` varchar(4) DEFAULT NULL COMMENT '供应商代码',
`SNAME` varchar(10) DEFAULT NULL COMMENT '供应商姓名',
`STATUS` int DEFAULT NULL COMMENT '供应商状态',
`CITY` varchar(3) DEFAULT NULL COMMENT '城市'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3;

/*Data for the table `s` */

insert into `s`(`SNO`,`SNAME`,`STATUS`,`CITY`) values ('S1','精益',20,'天津'),('S2','盛锡',10,'北京'),('S3','东方红',30,'北京'),('S4','丰泰盛',20,'天津'),('S5','为民',30,'上海');

/*Table structure for table `spj` */

DROP TABLE IF EXISTS `spj`;

CREATE TABLE `spj` (
`SNO` varchar(4) DEFAULT NULL COMMENT '供应商代码',
`PNO` varchar(4) DEFAULT NULL COMMENT '零件代码',
`JNO` varchar(4) DEFAULT NULL COMMENT '工程项目代码',
`QTY` int DEFAULT NULL COMMENT '供应数量'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3;

/*Data for the table `spj` */

insert into `spj`(`SNO`,`PNO`,`JNO`,`QTY`) values ('S1','P1','J1',200),('S1','P1','J3',100),('S1','P1','J4',700),('S1','p2','J2',100),('S2','P3','J1',400),('S2','P3','J2',200),('S2','P3','J5',400),('S2','P5','J2',100),('S2','P3','J4',500),('S2','P5','J1',400),('S3','P3','J1',200),('S3','P1','J1',200),('S4','P6','J3',300),('S4','P6','J4',200),('S4','P5','J1',100),('S5','P3','J1',200),('S5','P6','J2',200),('S5','P6','J4',500),('S5','P2','J4',100);

/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;

操作

1.针对SPJ数据库,查询S表中供应商所在城市为天津的SNO,SNAME, CITY

1
2
3
SELECT SNO,SNAME,CITY
FROM S
WHERE CITY = '天津';

zZoNZV.png

2.查询工程项目所在城市有哪些

1
2
SELECT CITY
FROM j;

zZo2dK.png

3. 查询SPJ表中供应数量大于200的记录的SNO,PNO,JNO,QTY,分别以供应商代码,零件代码,工程项目代码,供应数量显示

1
2
3
SELECT SNO AS `供应商代码`,PNO AS `零件代码`,JNO AS `工程项目代码`,QTY AS `供应数量显示`
FROM spj
WHERE QTY > 200;

zZo4RH.png

4.查询工程项目所在城市为北京、天津、南京的工程项目信息

1
2
3
SELECT * 
FROM j
WHERE CITY = '北京' OR CITY = '天津' OR CITY = '南京';

zZooQA.png

5.查询所有名称第一个字为“螺”的零件的信息

1
2
3
SELECT *
FROM p
WHERE PNAME LIKE '螺%';

zZoTsI.png

6.查询第二个字为“轮”的零件的信息

1
2
3
SELECT *
FROM p
WHERE PNAME LIKE '_轮%';

zZTpyn.png

7. 查询红色且重量大于20的零件的信息

1
2
3
SELECT *
FROM p
WHERE COLOR = '红' AND WEIGHT > 20;

zZTFoT.png

8. 查询红色或重量大于20的零件的信息

1
2
3
SELECT *
FROM p
WHERE COLOR = '红' OR WEIGHT > 20;

zZTnyR.png

9.查询工程项目所在地不为北京和天津的工程项目信息

1
2
3
SELECT *
FROM j
WHERE CITY <> '北京' AND CITY <> '天津';

zZT3FO.png

10.从SPJ表中查询工程项目代码为J1的记录信息,并按照供应数量递增排序。

1
2
3
4
SELECT * 
FROM spj
WHERE JNO = 'J1'
ORDER BY QTY ASC;

zZTtld.png

11. 统计SPJ表中使用P3零件的总数量,最小数量、最多数量、平均数量

1
2
3
SELECT SUM(QTY) AS `总数量`,MIN(QTY) AS `最小数量`,MAX(QTY) AS `最大数量`,AVG(QTY) AS `平均数量`
FROM spj
WHERE PNO = 'P3';

zZTDk8.png

12.统计SPJ表中使用各种零件的总数量,最小数量、最多数量、平均数量

1
2
3
SELECT spj.SNO AS `供应商代码`,SUM(QTY) AS `总数量`,MIN(QTY) AS `最小数量`,MAX(QTY) AS `最大数量`,AVG(QTY) AS `平均数量`
FROM spj
GROUP BY spj.SNO

zZTg6s.png

13.统计SPJ表中各工程项目分别使用了几种零件

1
2
3
SELECT spj.`JNO`,COUNT(PNO)
FROM spj
GROUP BY JNO;

zZTh7V.png

14.统计SPJ表中各工程项目分别使用各种零件的总数量

1
2
3
4
SELECT spj.`JNO`,spj.`PNO`,SUM(QTY)
FROM spj
GROUP BY JNO,PNO
ORDER BY JNO;

zZTohF.png

15.查询SPJ表中使用零件种类超过两种的工程项目

1
2
3
4
SELECT spj.`JNO`,COUNT(PNO)
FROM spj
GROUP BY JNO
HAVING COUNT(PNO) > 2;

zZTxAK.png

16.查询SPJ表中各供应商分别给几个项目供应零件

1
2
3
SELECT SNO ,COUNT(JNO)
FROM spj
GROUP BY SNO;

zZ799e.png

17.查询SPJ表中各供应商分别供应每种零件给几个项目,及供应每种零件的总数量

1
2
3
SELECT SNO ,JNO,SUM(QTY)
FROM spj
GROUP BY SNO,JNO;

zZ7ZAf.png

18.查询SPJ表中所有供应商代码,供应商姓名,零件名,工程项目名,供应数量,且供应数量>200的项目信息

1
2
3
4
5
6
SELECT spj.`SNO` AS `供应商代码`,s.`SNAME` AS `供应商名`
,p.`PNAME` AS `零件名`,j.`JNAME` AS `项目名`
,spj.`QTY` AS 供应数量
FROM spj,s,p,j
WHERE spj.`SNO` = s.`SNO` AND spj.`JNO` = j.`JNO`
AND spj.`PNO` = p.`PNO` AND QTY > 200;

zZ73Bq.png

19. 查询所有工程项目代码,工程项目名,所在城市,及使用的各零件代码,和数量

1
2
3
4
5
6
7
8
SELECT 
spj.`JNO` AS `工程项目代码`
,j.`JNAME` AS `工程项目名`
,j.`CITY` AS `所在城市`
,spj.`PNO` AS `零件代码`
,spj.`QTY` AS `数量`
FROM spj,j
WHERE spj.`JNO` = j.`JNO`;

zZ7c4O.png

==以下使用嵌套查询实现==

20.查询S1供应商供应的工程项目代码,工程项目名,所在城市

1
2
3
4
5
6
7
SELECT j.`JNO`,j.`JNAME`,j.`CITY`
FROM j
WHERE j.`JNO` IN (
SELECT spj.`JNO`
FROM spj
WHERE spj.`SNO` = 'S1'
);

zZ75DI.png

21.查询使用蓝色零件的项目的工程项目代码,工程项目名,所在城市

1
2
3
4
5
6
7
8
9
10
11
12
SELECT j.`JNO`,j.`JNAME`,j.`CITY`
FROM j
WHERE j.`JNO` IN(
SELECT j.`JNO`
FROM spj
WHERE spj.`PNO` IN(
SELECT p.`PNO`
FROM p
WHERE p.`COLOR` = '蓝'

)
);

zZ7Xvj.png

22.查询SPJ表中使用数量超过200的零件代码,零件名,颜色

1
2
3
4
5
6
7
8
SELECT p.`PNO`,p.`PNAME`,p.`COLOR`
FROM p
WHERE p.`PNO` IN(
SELECT spj.`PNO`
FROM spj
WHERE spj.`QTY` > 200

);

zZHpV0.png

23.查询和s1在同一个城市的供应商代码,供应商名称

1
2
3
4
5
6
7
SELECT X.`SNO`,X.`SNAME`
FROM s X
WHERE X.`CITY` IN (
SELECT Y.`city`
FROM s Y
WHERE Y.`SNO` = 'S1'
);

zZHVM9.png

24.查询所有使用了p1零件项目代码,名称,城市(用exists查询实现)

1
2
3
4
5
6
7
8
SELECT j.`JNO`,j.`JNAME`,j.`CITY`
FROM j
WHERE EXISTS
(
SELECT spj.`JNO`
FROM spj
WHERE j.`JNO` = spj.`JNO` AND spj.`PNO` = 'p1'
);

zZHnVx.png

25.查询没有使用p1零件的项目代码,名称,城市(用not exists查询)

1
2
3
4
5
6
7
8
SELECT j.`JNO`,j.`JNAME`,j.`CITY`
FROM j
WHERE NOT EXISTS
(
SELECT spj.`JNO`
FROM spj
WHERE j.`JNO` = spj.`JNO` AND spj.`PNO` = 'p1'
);

zZHlGD.png

java实现微信信息定时发送

java实现微信信息定时发送

今天遇到一个问题,需要在凌晨0点发送信息,但是怕之前想好的信息遗忘,因此希望编写一个java程序来实现程序按时发送

分析可得,整个程序可以分为三个问题:

  • java调用微信发送信息
  • 创建一个信息池,来存储要发送的信息
  • 设置时间,发送信息

java调用微信给特定对象发送信息

参考blog:

(188条消息) Java实现微信每天定时发送消息,指定好友 – 柚子真好吃_我是小金毛的博客-CSDN博客_java微信给指定好友发消息

(188条消息) 使用Java实现发送微信消息(附源码)_此程序在手再也不怕对象跟你闹了_Willing卡卡的博客-CSDN博客_java发送微信消息

分析blog的 robot类很重要

(188条消息) Java Robot类使用指南_Javee-Y的博客-CSDN博客_robot类

因此 ,java调用电脑上的程序是通过robot对象来实现的。

robot类略解

(188条消息) Java中Robot类详解_MardenSSS的博客-CSDN博客_robot类

具体思路

通过java的robot( )类来模拟人的操作

  • 使用java的robot( )类来模拟人的操作
  • 使用win的快捷键来操作微信
  • 使用robot来执行win的快捷键来实现对微信的操作

打开微信

程序前提:需要首先登录微信

win快捷键

alt + ctrl +w

java代码

1
2
3
4
5
6
robot = new Robot();
//用robot模拟 alt+win+w 直接调用微信
robot.keyPress(KeyEvent.VK_CONTROL);
robot.keyPress(KeyEvent.VK_ALT);
robot.keyPress(KeyEvent.VK_W);

延迟操作

java操作微信没有延迟,但是微信的打开和操作有延迟,为了避免发生冲突,需要在每次完成玩一个程序后执行一个延迟操作

1
robot.delay(1000);

单位为毫秒

按键释放操作

必须释放按压,按压操作并不会随着程序的结束而结束

1
2
3
4
5
//释放Ctrl按键,像Ctrl,退格键,删除键这样的功能性按键,在按下后一定要释放
robot.keyRelease(KeyEvent.VK_CONTROL);
robot.keyRelease(KeyEvent.VK_ALT);
robot.keyRelease(KeyEvent.VK_W);

不释放的话 会影响程序之后的电脑操作

搜索好友

快捷键

Ctrl +F

java代码

1
2
3
// Ctrl + F 搜索指定好友
robot.keyPress(KeyEvent.VK_CONTROL);
robot.keyPress(KeyEvent.VK_F);

进去

enter

实现输入

1
2
3
4
5
//按下输入 enter
robot.keyPress(KeyEvent.VK_ENTER);
//释放
robot.keyRelease(KeyEvent.VK_ENTER);
robot.delay(1000);

信息输入

类似搜索程序

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

String msg = "该信息为测试程序,不用回复";
tText = new StringSelection(msg);
clip.setContents(tText,null);

// 以下两行按下了ctrl+v,完成粘贴功能
robot.keyPress(KeyEvent.VK_CONTROL);
robot.keyPress(KeyEvent.VK_V);

//释放
robot.keyRelease(KeyEvent.VK_CONTROL);
robot.keyRelease(KeyEvent.VK_V);


robot.delay(1000);

//按下输入 enter
robot.keyPress(KeyEvent.VK_ENTER);
//释放
robot.keyRelease(KeyEvent.VK_ENTER);
robot.delay(1000);

完整的操作程序

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
import java.awt.*;
import java.awt.datatransfer.Clipboard;
import java.awt.datatransfer.StringSelection;
import java.awt.datatransfer.Transferable;
import java.awt.event.KeyEvent;

public class test {

public static void main(String[] args) {
System.out.println("程序开始执行");
Robot robot = null;
try {
//创建robot对象
robot = new Robot();
//用robot模拟 alt+win+w 直接调用微信
robot.keyPress(KeyEvent.VK_CONTROL);
robot.keyPress(KeyEvent.VK_ALT);
robot.keyPress(KeyEvent.VK_W);

//释放Ctrl按键,像Ctrl,退格键,删除键这样的功能性按键,在按下后一定要释放
robot.keyRelease(KeyEvent.VK_CONTROL);
robot.keyRelease(KeyEvent.VK_ALT);
robot.keyRelease(KeyEvent.VK_W);

//执行一个延迟
robot.delay(1000);

// Ctrl + F 搜索指定好友
robot.keyPress(KeyEvent.VK_CONTROL);
robot.keyPress(KeyEvent.VK_F);
//释放按键
robot.keyRelease(KeyEvent.VK_CONTROL);
robot.keyRelease(KeyEvent.VK_F);



//将信息放到粘贴板上 并且发送
Clipboard clip = Toolkit.getDefaultToolkit().getSystemClipboard();
Transferable tText = new StringSelection("聂八一");
clip.setContents(tText, null);

// 以下两行按下了ctrl+v,完成粘贴功能
robot.keyPress(KeyEvent.VK_CONTROL);
robot.keyPress(KeyEvent.VK_V);

//释放
robot.keyRelease(KeyEvent.VK_CONTROL);
robot.keyRelease(KeyEvent.VK_V);


robot.delay(1000);

//按下输入 enter
robot.keyPress(KeyEvent.VK_ENTER);
//释放
robot.keyRelease(KeyEvent.VK_ENTER);
robot.delay(1000);


//可以输入信息了
//按照先放到剪切板 后赋值 后enter实现输入

String msg = "该信息为测试程序,不用回复";
tText = new StringSelection(msg);
clip.setContents(tText,null);

// 以下两行按下了ctrl+v,完成粘贴功能
robot.keyPress(KeyEvent.VK_CONTROL);
robot.keyPress(KeyEvent.VK_V);

//释放
robot.keyRelease(KeyEvent.VK_CONTROL);
robot.keyRelease(KeyEvent.VK_V);


robot.delay(1000);

//按下输入 enter
robot.keyPress(KeyEvent.VK_ENTER);
//释放
robot.keyRelease(KeyEvent.VK_ENTER);
robot.delay(1000);





} catch (AWTException e) {
throw new RuntimeException(e);
}
System.out.println("程序执行结束");
}
}

总结:无论是昵称还是取得称号都是可以的

定时技术

分析可得逻辑

  • 先设置一个预定的对象
  • 通过java里的system对象来获得系统时间(当时的时间)

获得当前时间方法

1
2
3
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:SSS");
String time = df.format(System.currentTimeMillis());
System.out.println("现在时间是:" + time);

java设置时间格式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
//设置时间
int year = 2022;
int month = 11;
String day = "06";
int hour = 20;
int min = 40;
String today = year+"-"+month+"-"+day+" "+hour+":"+min;
System.out.println("目标时间:"+today);
while (true){
time = df.format(System.currentTimeMillis());
time2 = df1.format(System.currentTimeMillis());
//沉睡疫苗
try {
sleep(1000);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
System.out.println(time2);
if (time.equals(today)){
System.out.println("到时候了");
break;
}
}

TimeUtil

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
package com.dwx.utils;

import java.text.SimpleDateFormat;

public class TimeUtil {

//当前时间
private String timeNow = null;
//目标时间
private String targetTime = null;

//设置目标时间
public String setTargetTime(String year, String month, String day, String hour, String min) {
targetTime = year + "-" + month + "-" + day + " " + hour + ":" + min;
System.out.println("目标时间为:" + targetTime);
return targetTime;
}

//获得时钟 直到秒
public String getClockToSecond() {
long l = System.currentTimeMillis();
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String time = df.format(l);
System.out.println(time);
return time;
}

//获得时钟 直到分钟
public String getClockToMin() {
long l = System.currentTimeMillis();
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm");
timeNow = df.format(l);
System.out.println(timeNow);
return timeNow;
}
}

两个程序执行结束

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
package com.dwx.main;

import com.dwx.utils.RobotUtil;
import com.dwx.utils.TimeUtil;

import static java.lang.Thread.sleep;

public class demo01 {
public static void main(String[] args) {
RobotUtil robotUtil = new RobotUtil();
String msg1 = robotUtil.getFriendWin("文件传输助手");
System.out.println(msg1);
String s = robotUtil.sendMsg("定时发送数据程序测试");
System.out.println(s);

//设置时间
TimeUtil timeUtil = new TimeUtil();
String t1 = timeUtil.setTargetTime("2022", "11", "06", "21", "13");
while (true){
//沉睡一秒
try {
sleep(1000);
} catch (InterruptedException e) {
System.out.println("sleep出错:"+e);
}
timeUtil.getClockToSecond();
String t2 = timeUtil.getClockToMin();
if (t1.equals(t2)){
//时间正确 执行信息发送
robotUtil.getFriendWin("文件传输助手");
robotUtil.sendMsg("时间到 执行程序");
break;
}
}


}
}

程序前提:

  • 微信登录
  • 微信窗口隐藏

信息池

  • 用String[ ]即可
  • 或者使用txt文件也行

使用String[ ]做信息池

1
2
3
4
5
6
7
8
9
10
11
12
13
14
String[] msg = new String[]{
"信息一",
"信息一",
"信息一",
"信息一",
"信息一",
"信息一",
"信息一",
"信息一",
"信息一",
"信息一",
"信息一",
"信息一",
};

实战

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
package com.dwx.main;

import com.dwx.utils.RobotUtil;
import com.dwx.utils.TimeUtil;

import static java.lang.Thread.sleep;

public class demo01 {
public static void main(String[] args) {
RobotUtil robotUtil = new RobotUtil();
//设置时间
TimeUtil timeUtil = new TimeUtil();
String t1 = timeUtil.setTargetTime("2022", "11", "06", "21", "35");
while (true){
//沉睡一秒
try {
sleep(1000);
} catch (InterruptedException e) {
System.out.println("sleep出错:"+e);
}
timeUtil.getClockToSecond();
String t2 = timeUtil.getClockToMin();
if (t1.equals(t2)){
//时间正确 执行信息发送
break;
}
}

//信息池
String[] msg = new String[]{
"信息一",
"信息一",
"信息一",
"信息一",
"信息一",
"信息一",
"信息一",
"信息一",
"信息一",
"信息一",
"信息一",
"信息一",
};
robotUtil.getFriendWin("文件传输助手");
int i = 1;
for (String s : msg) {
robotUtil.sendMsg(s+i++);
}



}
}

结果

xjYK4s.png

使用txt文件当做信息池

原理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public static void main(String[] args) {
//文件读写
String fileUrl = "E:\\java\\wechatTest\\src\\main\\resources\\msg.txt";
File file = new File(fileUrl);
BufferedReader bufferedReader = null;
try {
bufferedReader = new BufferedReader(new FileReader(file));

String s = bufferedReader.readLine();
while (null != s){
System.out.println(s);
s = bufferedReader.readLine();
}

} catch (FileNotFoundException e) {
System.out.println(e);
} catch (IOException e) {
System.out.println(e);
}

}

实战

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
package com.dwx.main;

import com.dwx.utils.FileUtil;
import com.dwx.utils.RobotUtil;
import com.dwx.utils.TimeUtil;

import java.util.List;

import static java.lang.Thread.sleep;

public class demo01 {
public static void main(String[] args) {
RobotUtil robotUtil = new RobotUtil();
//设置时间
TimeUtil timeUtil = new TimeUtil();
String t1 = timeUtil.setTargetTime("2022", "11", "06", "21", "57");
while (true){
//沉睡一秒
try {
sleep(1000);
} catch (InterruptedException e) {
System.out.println("sleep出错:"+e);
}
timeUtil.getClockToSecond();
String t2 = timeUtil.getClockToMin();
if (t1.equals(t2)){
//时间正确 执行信息发送
break;
}
}

//信息池
FileUtil fileUtil = new FileUtil();
List<String> msgByFile = fileUtil.getMsgByFile();

robotUtil.getFriendWin("文件传输助手");

for (String s : msgByFile) {
robotUtil.sendMsg(s);
}


}
}

效果

xjYQCn.png

三毛别惨案

三毛别罴

在日本沿用的中文里,有一种叫做罴的生物。它们的体型巨大而且盛行狡诈,不仅能够直立行走,还擅长模仿人类的动作,是一种非常危险的存在。传说中罴会将牛粪像帽子一样顶在头上,在远处缓缓的招手,从而吸引路人的注意,一旦靠近,就会立即遭到他们的捕食。古书里描述的这种怪兽,其实就是现在的棕熊。事实上,在大多数情况下,他们不会主动攻击人类,但在一些特殊的情况下,棕熊会变得异常可怕,而其中一些极端的个例甚至会变得完全不再像是一只动物……..

今天,我们来介绍日本历史最诡异的棕熊袭击事件——“三毛别“”事件。

1915年12月9日,日本北海道逐渐步入寒冷的严冬,当地居民们也开始囤积过冬用的粮草和谷物,准备迎接新一天的到来。村民天天完成了上午的劳作回到家里,还没开门一股血腥味扑鼻而来,他在慌忙进屋后,却看到这这生最恐怖的画面,整个茅房屋一片狼藉,到处都是浓稠的血迹,屋内只剩下一个被咬掉脑袋的孩子身体,无力的耷拉在椅子上,墙上破了一个大洞,年轻的的妻子也消失的无影无踪,太田被眼前的惨案吓得惊声大叫,赶紧跑到村子里求援。前来帮忙的村民们从后现场留下的大洞判断,这很可能棕熊导致的,因为在北海道也只有这种野兽有破屋伤人的能力。

但诡异的是,太田家门外挂满了鱼干等食物,却一点都没动,这不符合常理,作为一只棕熊不该忽视近在眼前的食物而选择破屋食人,全民们都匪夷所思,却又都不知道背后的原因,一种恐怖的气氛笼罩着这个小山村。第二天村民们为了躲避熊害组织了集体迁移,老人、女人和孩子往三毛别的下游迁移,另外选择村子里精壮的年轻人组成剩捕猎队,进入雪山寻找这只食人猛兽。

队伍顺着血迹,很快就在深山里寻找到了一具只剩下两条腿的尸体,根据衣服判断正是太田的妻子,残骸被粗糙的埋在雪地里像极了动物储存食物的行为。捕猎队在周围的雪地里找了很久,但除此之外,再也没有找到任何线索。

恐怖的氛围已经笼罩了所有村民,他们找来了著名的猎熊人山本兵吉,这位经验丰富的猎熊人说出了更为恐怖的推论,在正常情况下棕熊不会吃人,但如果这头熊尝过人肉的滋味就会开始忽略其余的食物而首选人类为食,而这只出现在村里的怪物很可能是一只被称作“袈裟悬”的大棕熊。

它胸口有一块斜向的伤疤,特别喜欢直立行走,远看就像是披着一件袈裟一样。这头棕熊已经连续吃掉数人,他现在对人肉的味道上瘾,而且异常喜食女性。这一切都有三毛别的惨案完全吻合。如果真的·是袈裟悬,那么现在所有的村民都非常危险,这只熊的食人经验太过丰富,现在已经变得异常狡诈和恐怖,普通人根本就无法对付。山本让队员赶快疏散居民,在自己取回管用的猎枪后就会赶过去帮忙。而他们不知道的是,一场更为骇人听闻的事件却已经在明景的家里降临。

12月10日晚上,在三毛别下游的一间房舍里,明景的妻子与四个儿子还有几个避难的村民正准备休息,他们的茅屋却开始了剧烈的晃动,一只恐怖的熊头从屋外伸了进来,它的颈部到肩部有着一道巨大的伤疤,正是那只可怕的袈裟悬。棕熊很快破房而入,它熟练地扑灭可能会伤害到自己的炉火,然后就瞄准众人扑了过来,一位老年男子在匆忙跑出屋后,就被快速的仆倒在地,在被咬成重伤后,这只怪物马上就失去了兴趣,它慢慢地靠近其他人,开始了有一场可怕的游戏,明净的三个三个儿子相继死去,三儿子在被棕熊咬了一口后,被棕熊叼起,像玩具一样在地上摔来摔去,当它正准备食用绝望的母亲时,却突然被一种特殊的味道所吸引,紧接着,他就从卧室的角落里拖出了一名躲藏起来的孕妇,在无助的求助声下,棕熊一点一点地啃食其她的身体,凄厉的惨叫声在寂静的山村中回荡着,闻声而来的村民从来没见过这样的场景,当他们回过神知道要围绕房屋时,袈裟悬却叼起了孕妇残破的身体,趁乱跑进了山林。

在不到两天的时间里袈裟悬已经杀吃了7个人,重伤了3人,事情引起了社会动荡,1915年12月12日北海道政府组织了高达600人的捕杀队伍进入深山势必要杀死这只杀人的袈裟悬。

本来以为可以很快的猎杀棕熊,但连续几天的时间都没有找到他的踪影。讨伐对有分别在三毛别村的上下游设立了多种陷阱来诱捕这只凶兽,更加离奇的事情发生了,袈裟悬在陷阱的吸引下出现过两次,但每次在接近射程的时候,却会诡异的突然转身离去。

恐怖已经蔓延了整个北海道,就在这时猎熊人山本兵吉取回自己的猎枪赶到了三毛别,帮助警方拟定了全新的捕猎计划,在一次深夜的行动中搜捕队忽然发现了一个站立不动的黑影,在对其呼喊过后它却没有做出任何回应,山本感觉到不对,然后立即向其开枪,在众人不可思议的目光下,那具黑影突然四脚着地往深山跑去。

12月14日,山里飘起了零碎的雪花,山本也在山里发现了动物被枪机后留下的血迹,为避免惊动袈裟悬,山本独自一人利用泥土掩盖身上的气味,追踪着被猎枪打伤的血迹寻找袈裟悬的踪影,大雪纷飞的深山中山本经过数小时的追踪终于发现了正在树下踱步的棕熊。它被山下的部队所吸引,丝毫没有感觉到危险的到来。

他紧闭呼吸在靠近20米的距离对着袈裟悬的心脏开了一枪,激怒的袈裟悬向山本兵吉扑去,他又对准袈裟悬的眼窝开了一枪,这一枪准确的把袈裟悬穿脑轰然倒地。袈裟悬的尸体被讨伐队抬了回去,经过测量这只食人熊袈裟悬足足有3米之高。

村民把袈裟悬的肚子切开,女人的尸体,衣物和毛发就这样暴露在人们的眼前,愤怒的村民把这头巨熊切割成了无数块,在将其煮熟后宫全村分食。而在一周后,有人在山林里发现袈裟悬大的离奇的洞穴,里边藏匿的很多女人的衣物和用品,这更加使得人们感到毛骨悚然。

网站2.1优化

2.1版本优化

程序存在的问题是:

  • 长文章展示有点混乱,不会换行
  • 不能做到模糊查询,没有输入完整的关键字就无法查询到东西

富文本代替正常的文本

xI5ge0.png

程序出现的问题是,数据库存储的只有文字,没有html里的标签,html无法展示

xI5fFU.png

数据库里数据格式正常

修改数据库数据格式xI5hYF.png)

修改后程序的效果

xI5ol9.png

遗留问题:

程序没有内置富文本编译器,因此需要管理员在编辑关键字的时候加上</br>

模糊查询

修改sql为

1
select * from union.interpretation where keyword like  concat('%',#{keyword},'%')

xI5bex.png

xI5XFO.png

问题:格式有点怪,后续进行修改

天梯计划2.0版本

天梯计划2.0版本

版本特色

(1)在1.x版本的基础上,2.0版本准备在登录页面加入一个人脸识别程序,以防都忘记密码造成损失。

(2)为了安全性着想 给密码进行加密MD5加密

两种功能,明显加密功能是更好实现的,可以选择先实现,不过这样需要修改大量源代码

加密

本程序采用MD5加密方法,MD5加密的好处是,

  • 加密是单向的,就算数据库被打破了,还是照样能使用的。
  • java自带有MD5加密方法,这就使得我们操作起来变得简单

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
package com.dwx.until;

import java.io.UnsupportedEncodingException;
import java.math.BigInteger;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

public class MD5Util {

public String getMD5(String password) {


byte[] digest = null;
try {
MessageDigest md5 = MessageDigest.getInstance("md5");
digest = md5.digest(password.getBytes());
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
//16是表示转换为16进制数
String md5Str = new BigInteger(1, digest).toString(16);
return md5Str;
}

}


总结下来 修改代码并不多

  • 登录 需要将明码转化成MD5码
  • 修改 需要把获得的旧密码 新密码转化成MD5码

总之 加密已经完成

人脸识别系统

人脸识别系统需要两种技术

  • 调用摄像头 并且能够拍照
  • 人脸识别技术(对照技术)

对于人脸识别技术已经有了一些认识,参考之前的blog

人脸识别深入认识 | dwx-tx的小天地

但是对于调用摄像头技术,还没有掌握,下边计划先学习网页调用摄像头技术

假设,网页可以调用摄像头并且拍照,可以将拍好的照片暂时生成在服务器中,对比后,删除这个照片即可。

网页调用摄像头拍照技术

参考之前的blog

网页调用摄像头技术 | dwx-tx的小天地

这样后端就接收到了前端传递过来的二进制流,利用二进制流生成图片技术生成前端传递过来的图片

二进制流生成图片技术

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
package com.dwx.until;

import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.nio.file.Path;
import java.nio.file.Paths;

//这是一个文件操作
public class FileUtil {

//一个文件读取操作
public String fileUpLoad(MultipartFile myfile,String filename, String fileUrl){
//此路径为 服务器要存储文件的文件夹的路径


//创建新文件
File file = new File(fileUrl+filename);
InputStream inputStream = null;
FileOutputStream fileOutputStream = null;
String result = null;
try {

//获得input流
inputStream = myfile.getInputStream();

fileOutputStream = new FileOutputStream(file);



//固定的文件写操作
int read;
byte[] bytes = new byte[1024];

while ((read = inputStream.read(bytes)) != -1) {
fileOutputStream.write(bytes, 0, read);
}
//如果一切成功
result = "success";


} catch (Exception e) {
System.out.println("程序出错了");
System.out.println(e);
//如果产生了异常 返回false
return "false";

}finally {

//关闭所有的流
try {
fileOutputStream.close();
inputStream.close();
} catch (IOException e) {
throw new RuntimeException(e);
}
}
return result;
}


//一个文件删除操作
public boolean fileDelete(String fileName){
//直接删除
String fileUrl = "/img";

System.out.println(fileUrl + fileName);
File file = new File(fileUrl + fileName);
System.out.println(file.isFile());
boolean delete = file.delete();


return delete;
}



}

controller类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
package com.dwx.controller;

import com.dwx.until.FileUtil;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

@Controller
public class areFaceController {

@RequestMapping(value = "/areFace.do")
@ResponseBody
public String areFaceTest(HttpServletRequest request,HttpServletRequest response,HttpSession session) {
MultipartHttpServletRequest multipartRequest=(MultipartHttpServletRequest) request;
MultipartFile myfile = multipartRequest.getFile("file");


//获得正规的
String fileName = myfile.getOriginalFilename();
System.out.println(fileName);
int local = fileName.lastIndexOf(".");
System.out.println(local);
String fileType = fileName.substring(local);
System.out.println("文件类型为:"+fileType);

//获得路径
String contextPath = request.getContextPath();
FileUtil fileUtil = new FileUtil();
String fileUrl = "E:\\java\\union\\src\\main\\java\\com\\dwx\\img\\";


String filename = "test";
//文件上传操作
String s = fileUtil.fileUpLoad(myfile, filename+fileType,fileUrl);

System.out.println("图片生成成功");
//对数据库里的File进行一个增加

return s;


}

}

人脸识别技术

可以参考以前的blog

人脸识别深入认识 | dwx-tx的小天地

利用类似技术来实现人脸识别

具体思路

  • 创建数据库,这里不给管理员设置上传脸部信息的途径,只能通过我操作数据库来上传数据
  • 调用人脸识别工具类获得人的面部信息
  • 调用faceService获得数据库存储的人脸信息
  • 通过一对多的匹配得到可能性最高,且合适的对象
  • 完成登录操作

这里需要注意,SDK的依赖需要手动导入,引擎需要放的后台中

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
package com.dwx.controller;

import com.dwx.pojo.AreFace;
import com.dwx.pojo.User;
import com.dwx.service.FaceFeatureService;
import com.dwx.service.UserService;
import com.dwx.until.AreFaceUtil;
import com.dwx.until.FileUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.util.List;

@Controller
public class AreFaceController {


@Autowired
private FaceFeatureService faceFeatureService;

public FaceFeatureService getFaceFeatureService() {
return faceFeatureService;
}

@Autowired
private UserService userService;

public UserService getUserService() {
return userService;
}

public void setUserService(UserService userService) {
this.userService = userService;
}

public void setFaceFeatureService(FaceFeatureService faceFeatureService) {
this.faceFeatureService = faceFeatureService;
}

//下载图片程序
@RequestMapping(value = "/areFace.do")
@ResponseBody
public String areFaceTest(HttpServletRequest request, HttpServletResponse response, HttpSession session) {
MultipartHttpServletRequest multipartRequest=(MultipartHttpServletRequest) request;
MultipartFile myfile = multipartRequest.getFile("file");


AreFaceUtil areFaceUtil = new AreFaceUtil();
//调用程序 下载图片
fileDownload(myfile);

//调用service 获得数据库中的所有数据
List<AreFace> allAreFaceFeature = faceFeatureService.getAllAreFaceFeature();

//现在我们需要把String转化成byte
//用temp变量来存储最高分数的id
String temp = null;
//用mScore来存储最高分数
double mScore = 0;
for (AreFace areFace : allAreFaceFeature) {
double score = areFaceUtil.getAreFaceFeature(areFace.getAreFaceFeature());
System.out.print("管理员:"+areFace.getId()+"的人脸对比分数为:"+score);
System.out.println();
if (score > mScore){
mScore = score;
temp = areFace.getId();
}
}
//如果分数大于0.8 就可以说明找到了
if (mScore > 0.8){
System.out.println("找到了管理员:"+temp);
}

//调用userService通过id获得User

User userID = userService.getUserID(temp);

System.out.println(userID);
request.getSession().setAttribute("userSession",userID);
System.out.println("================");
//跳转到后端
try {
response.sendRedirect("/union/houtai/jsp/frame.jsp");
} catch (IOException e) {
throw new RuntimeException(e);
}
System.out.println("================");
return "ok";
}

public String fileDownload(MultipartFile myfile){
//获得正规的
String fileName = myfile.getOriginalFilename();
System.out.println(fileName);
int local = fileName.lastIndexOf(".");
System.out.println(local);
String fileType = fileName.substring(local);
System.out.println("文件类型为:"+fileType);

//获得路径
FileUtil fileUtil = new FileUtil();
String fileUrl = "E:\\java\\union\\src\\main\\java\\com\\dwx\\img\\";


String filename = "test";
//文件上传操作
String s = fileUtil.fileUpLoad(myfile, filename+fileType,fileUrl);

System.out.println("图片生成成功");
//对数据库里的File进行一个增加

return s;

}

}

遇到问题了

页面不跳转问题,请求都成功了,就是没跳转

参考解决办法

(183条消息) 解决java后台发起重定向响应成功,但前端不跳转页面问题_二十同学的博客-CSDN博客_java重定向跳转页面怎么不跳

分析是 后端的页面跳转与前端js相矛盾了 但是因为我不懂js 不会修改

网上的资料也不全

解决了 经过前端同学的帮助 解决的这个问题

修改后的HTML

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>网页调取摄像头</title>
</head>
<script src="https://code.jquery.com/jquery-3.3.1.min.js"></script>
<style>
#capture{
position: absolute;
right: 190px;
bottom: -40px;

}
#video{
position: absolute;
right: 0;
top: 0;
}
#img{
position: absolute;
left: 0;
top: 0;
}
.auto{
position: absolute;
left: 50%;
top: 50%;
height: 320px;
margin-top: -160px;
}
#sure{
position: absolute;
left: 210px;
bottom: -40px;

}
button{
cursor: pointer;
margin: 0 auto;
border: 1px solid #f0f0f0;
background: #5CACEE;
color: #FFF;
width: 100px;
height: 36px;
line-height: 36px;
border-radius: 8px;
text-align: center;
/*禁止选择*/
-webkit-touch-callout: none; /* iOS Safari */
-webkit-user-select: none; /* Chrome/Safari/Opera */
-khtml-user-select: none; /* Konqueror */
-moz-user-select: none; /* Firefox */
-ms-user-select: none; /* Internet Explorer/Edge */
user-select: none; /* Non-prefixed version, currently not supported by any browser */
}
body{
background-color: #61CAD0;
}

</style>
<body>

<div>
<a href="../login/login.jsp"><button id="back" style="height: 40px;" title="点击返回">返回登录页面</button></a>
</div>
<div class="auto">
<video id="video" width="480" height="320" autoplay></video>
<canvas id="canvas" width="480" height="320" style="display: none;"></canvas>
<img id="img" width="480" height="320" style="margin-left: 20px;background-color: #0a5eb6;">
<div>
<button id="capture" title="点击进行拍照">拍照</button>
</div>
<div>
<button id="sure" title="是否用这张图片进行验证">确认</button>
</div>
</div>


<script>
var file ,stream;
//访问用户媒体设备的兼容方法
function getUserMedia(constraints, success, error) {
if (navigator.mediaDevices.getUserMedia) {
//最新的标准API
navigator.mediaDevices.getUserMedia(constraints).then(success).catch(error);
} else if (navigator.webkitGetUserMedia) {
//webkit核心浏览器
navigator.webkitGetUserMedia(constraints,success, error)
} else if (navigator.mozGetUserMedia) {
//firfox浏览器
navigator.mozGetUserMedia(constraints, success, error);
} else if (navigator.getUserMedia) {
//旧版API
navigator.getUserMedia(constraints, success, error);
}
}

let video = document.getElementById('video');
let canvas = document.getElementById('canvas');
let context = canvas.getContext('2d');

function success(stream) {
//兼容webkit核心浏览器
let CompatibleURL = window.URL || window.webkitURL;
//将视频流设置为video元素的源
// console.log(stream);
stream = stream;
//video.src = CompatibleURL.createObjectURL(stream);
video.srcObject = stream;
video.play();
}

function error(error) {
console.log(`访问用户媒体设备失败${error.name}, ${error.message}`);
}

if (navigator.mediaDevices.getUserMedia || navigator.getUserMedia || navigator.webkitGetUserMedia || navigator.mozGetUserMedia) {
//调用用户媒体设备, 访问摄像头
getUserMedia({video : {width: 480, height: 320}}, success, error);
} else {
alert('不支持访问用户媒体');
}
// base64转文件

document.getElementById('capture').addEventListener('click', function () {
context.drawImage(video, 0, 0, 480, 320);
// 获取图片base64链接
var image = canvas.toDataURL('image/png');
// 定义一个img
var img = document.getElementById("img");
//设置属性和src
//img.id = "imgBoxxx";
img.src = image;
//将图片添加到页面中
//document.body.appendChild(img);
function dataURLtoFile(dataurl, filename) {
var arr = dataurl.split(','), mime = arr[0].match(/:(.*?);/)[1],
bstr = atob(arr[1]), n = bstr.length, u8arr = new Uint8Array(n);
while (n--) {
u8arr[n] = bstr.charCodeAt(n);
}
file = new File([u8arr], filename, {type: mime});
// console.log(file)
return new File([u8arr], filename, {type: mime});
}
console.log(dataURLtoFile(image, "aa.png"));
})

document.getElementById("sure").addEventListener("click", function () {
console.log(file)
console.log('发送Ajax请求')
var formData = new FormData();
formData.append("file",file);
$.ajax({
type: "post",
//后端需要调用的地址
url:"http://localhost:8089/plotform/areFace.do",
data:formData, //发送数据
async: true, // 是否异步
processData: false, //processData 默认为false,当设置为true的时候,jquery ajax 提交的时候不会序列化 data,而是直接使用data
contentType: false,
success:function(data){
console.log(data)
if(data === '200'){
console.log('请求成功,即将跳转')
window.location.href="../houtai/jsp/frame.jsp"
// console.log(`${data.message}`);
}else{
// console.log(`${data.message}`);
}
},
error:function(e){
// self.$message.warning(`${e}`);
console.log("请求失败"+e);
}
});
// stream.getTracks()[0].stop();//结束关闭流
})
</script>
</body>
</html>



后端:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
 package com.dwx.controller;

import com.dwx.pojo.AreFace;
import com.dwx.pojo.User;
import com.dwx.service.FaceFeatureService;
import com.dwx.service.UserService;
import com.dwx.until.AreFaceUtil;
import com.dwx.until.FileUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.util.List;



@Controller
public class AreFaceController {


@Autowired
private FaceFeatureService faceFeatureService;

public FaceFeatureService getFaceFeatureService() {
return faceFeatureService;
}

@Autowired
private UserService userService;

public UserService getUserService() {
return userService;
}

public void setUserService(UserService userService) {
this.userService = userService;
}

public void setFaceFeatureService(FaceFeatureService faceFeatureService) {
this.faceFeatureService = faceFeatureService;
}

//下载图片程序
@RequestMapping(value = "/areFace.do")
@ResponseBody
public String areFaceTest(HttpServletRequest request, HttpServletResponse response, HttpSession session) {
MultipartHttpServletRequest multipartRequest=(MultipartHttpServletRequest) request;
MultipartFile myfile = multipartRequest.getFile("file");


AreFaceUtil areFaceUtil = new AreFaceUtil();
//调用程序 下载图片
fileDownload(myfile);

//调用service 获得数据库中的所有数据
List<AreFace> allAreFaceFeature = faceFeatureService.getAllAreFaceFeature();

//现在我们需要把String转化成byte
//用temp变量来存储最高分数的id
String temp = null;
//用mScore来存储最高分数
double mScore = 0;
for (AreFace areFace : allAreFaceFeature) {
double score = areFaceUtil.getAreFaceFeature(areFace.getAreFaceFeature());
System.out.print("管理员:"+areFace.getId()+"的人脸对比分数为:"+score);
System.out.println();
if (score > mScore){
mScore = score;
temp = areFace.getId();
}
}
//如果分数大于0.8 就可以说明找到了
if (mScore > 0.8){
System.out.println("找到了管理员:"+temp);
}

//调用userService通过id获得User

User userID = userService.getUserID(temp);

System.out.println(userID);
request.getSession().setAttribute("userSession",userID);

//删除图片
boolean b = fileDelete();
if (b){
System.out.println("图片删除成功");
}else {
System.out.println("图片删除失败");
}
if (mScore > 0.8){
return "200";
}else {
return "300";
}
}

public String fileDownload(MultipartFile myfile){
//获得正规的
String fileName = myfile.getOriginalFilename();
System.out.println(fileName);
int local = fileName.lastIndexOf(".");
System.out.println(local);
String fileType = fileName.substring(local);
System.out.println("文件类型为:"+fileType);

//获得路径
FileUtil fileUtil = new FileUtil();
String fileUrl = "E:\\java\\union\\src\\main\\java\\com\\dwx\\img\\";


String filename = "test";
//文件上传操作
String s = fileUtil.fileUpLoad(myfile, filename+fileType,fileUrl);

System.out.println("图片生成成功");
//对数据库里的File进行一个增加

return s;
}

public boolean fileDelete(){
FileUtil fileUtil = new FileUtil();

String filename = "test";
boolean b = fileUtil.fileDelete( filename + ".png");
return b;
}
}

)

程序彻底写完了

某件事是否该做应该由常识决定

某件事是否可以做应该由常识决定

兄弟们,对事不对人。相信兄弟们这三年或多或少都会遇到这种情况:要做一件事,但是这件事会影响其他兄弟的利益,那这件事要不要做,是应该根据“有没有人说不可以”还是根据常识才判断呐?我个人认为应该根据常识来判断这件事是否应该做。

事情比如,午休时间打电话,晚睡时间打电话,午休时间打游戏,晚睡时间打游戏,午休时间刷视频,晚睡时间刷视频,乱丢垃圾等等等等。这些事情都是自己有权力做,做了自己很舒服,但是会影响其他兄弟们利益,让其他兄弟们难受的事。这些事情能不能做就应该通过常识判断,不能通过“今天没人说我这样做不对,那我就可以做”或者“今天有人说我这样做不对,那我就不做”来判断。

如果哪个兄弟做了上边类似的事,会有两种情况。第一种,其他的兄弟有可能会出来说“不可以这样做”,结果可能是被制止的人停止了,心里感到愧疚,下次注意,也可能是被制止的人心里感到愤怒“我有做这件事的权利,凭啥不让我做,事情真多”,下次如果没有人说,就理所应当施行自己认为的“权利”。第二种情况是,有的兄弟性格内向,为了维持表面上的平和,想说,但是憋在心里不说,这种情况的结果是,这些利益受到侵害的兄弟们内心堵得慌,产生怨气,室友之间只是表面上的亲近,可是做了这件事的兄弟,并不觉得自己做错了,并认为自己可以这样做,当成了一种习惯。矛盾越积越多,不知道什么时候就爆发,不利于室友之间的团结。

如果我们在做一件会影响到别人利益的事前,通过常识想一下,就能避免这种情况。比如,中午1点-2点甚至到3点,都会有好兄弟想睡觉,做事前想考虑一下会不会产生很大的噪音,一般的低声没人说什么的,如果有好兄弟说“能不能别做了”,那一定是被吵醒了。

凌晨11点30开始,相信有些兄弟就想睡觉了,但是没有睡觉的环境,只能困着,等着,等着寝室安静下来再去睡觉。对于睡眠质量好的兄弟们还好,对于睡眠质量差的兄弟们,相信每天不到7个小时的睡眠是不够的。(每周三到我值日的时候我都会扫地,地上倒是没有很多垃圾,但是头发毛发很多,跟睡眠质量很大相关)其他的只有利于自己,影响其他兄弟们的事情也可以这样考虑是否该做。

最后,总结一下。如果某次没人说“这件事不能做”,不代表这件事这次可以做,更不代表这件事以后永远可以做。如果有人说“这件事不能做”,不代表着这件事他不在的时候可以做,也不代表着以后他在但是没说所以可以做。

兄弟们通过常识判断一件事该不该做,相信寝室矛盾会减少的。

网页调用摄像头技术

网页调用摄像头技术

参考文档

[(182条消息) Html-网页调用摄像头并拍照效果_小狗蛋ing的博客-CSDN博客_网页调用摄像头](https://blog.csdn.net/As_thin/article/details/118313591?ops_request_misc=&request_id=&biz_id=102&utm_term=html 调用摄像头拍照&utm_medium=distribute.pc_search_result.none-task-blog-2allsobaiduweb~default-0-118313591.142^v62^pc_search_tree,201^v3^control_2,213^v1^t3_esquery_v2&spm=1018.2226.3001.4187)

(182条消息) 前端网页打开摄像头并将图像传给后端_blog_1103的博客-CSDN博客

别人的代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>网页调取摄像头</title>
</head>
<script src="https://code.jquery.com/jquery-3.3.1.min.js"></script>
<style>
#capture{
position: absolute;
right: 190px;
bottom: -40px;

}
#video{
position: absolute;
right: 0;
top: 0;
}
#img{
position: absolute;
left: 0;
top: 0;
}
.auto{
position: absolute;
left: 50%;
top: 50%;
height: 320px;
margin-top: -160px;
}
#sure{
position: absolute;
left: 210px;
bottom: -40px;

}
button{
cursor: pointer;
margin: 0 auto;
border: 1px solid #f0f0f0;
background: #5CACEE;
color: #FFF;
width: 100px;
height: 36px;
line-height: 36px;
border-radius: 8px;
text-align: center;
/*禁止选择*/
-webkit-touch-callout: none; /* iOS Safari */
-webkit-user-select: none; /* Chrome/Safari/Opera */
-khtml-user-select: none; /* Konqueror */
-moz-user-select: none; /* Firefox */
-ms-user-select: none; /* Internet Explorer/Edge */
user-select: none; /* Non-prefixed version, currently not supported by any browser */
}

</style>
<body>
<div class="auto">
<video id="video" width="480" height="320" autoplay></video>
<canvas id="canvas" width="480" height="320" style="display: none;"></canvas>
<img src="./body_default.png" id="img" width="480" height="320" style="margin-left: 20px;">
<div>
<button id="capture" title="点击进行拍照">拍照</button>
</div>
<div>
<button id="sure" title="是否用这张图片进行验证">确认</button>
</div>
</div>


<script>
var file ,stream;
//访问用户媒体设备的兼容方法
function getUserMedia(constraints, success, error) {
if (navigator.mediaDevices.getUserMedia) {
//最新的标准API
navigator.mediaDevices.getUserMedia(constraints).then(success).catch(error);
} else if (navigator.webkitGetUserMedia) {
//webkit核心浏览器
navigator.webkitGetUserMedia(constraints,success, error)
} else if (navigator.mozGetUserMedia) {
//firfox浏览器
navigator.mozGetUserMedia(constraints, success, error);
} else if (navigator.getUserMedia) {
//旧版API
navigator.getUserMedia(constraints, success, error);
}
}

let video = document.getElementById('video');
let canvas = document.getElementById('canvas');
let context = canvas.getContext('2d');

function success(stream) {
//兼容webkit核心浏览器
let CompatibleURL = window.URL || window.webkitURL;
//将视频流设置为video元素的源
console.log(stream);
stream = stream;
//video.src = CompatibleURL.createObjectURL(stream);
video.srcObject = stream;
video.play();
}

function error(error) {
console.log(`访问用户媒体设备失败${error.name}, ${error.message}`);
}

if (navigator.mediaDevices.getUserMedia || navigator.getUserMedia || navigator.webkitGetUserMedia || navigator.mozGetUserMedia) {
//调用用户媒体设备, 访问摄像头
getUserMedia({video : {width: 480, height: 320}}, success, error);
} else {
alert('不支持访问用户媒体');
}
// base64转文件

document.getElementById('capture').addEventListener('click', function () {
context.drawImage(video, 0, 0, 480, 320);
// 获取图片base64链接
var image = canvas.toDataURL('image/png');
// 定义一个img
var img = document.getElementById("img");
//设置属性和src
//img.id = "imgBoxxx";
img.src = image;
//将图片添加到页面中
//document.body.appendChild(img);
function dataURLtoFile(dataurl, filename) {
var arr = dataurl.split(','), mime = arr[0].match(/:(.*?);/)[1],
bstr = atob(arr[1]), n = bstr.length, u8arr = new Uint8Array(n);
while (n--) {
u8arr[n] = bstr.charCodeAt(n);
}
file = new File([u8arr], filename, {type: mime});
return new File([u8arr], filename, {type: mime});
}
console.log(dataURLtoFile(image, 'aa.png'));
})

document.getElementById('sure').addEventListener('click', function () {
var formData = new FormData();
formData.append("file",file);
$.ajax({
type: "POST", // 数据提交类型
url: "***********", // 发送地址
data: formData, //发送数据
async: true, // 是否异步
processData: false, //processData 默认为false,当设置为true的时候,jquery ajax 提交的时候不会序列化 data,而是直接使用data
contentType: false,
success:function(data){
if(data.code === 200){
console.log(`${data.message}`);
}else{
console.log(`${data.message}`);
}
},
error:function(e){
self.$message.warning(`${e}`);
//console.log("不成功"+e);
}
});
stream.getTracks()[0].stop();//结束关闭流
})
</script>
</body>
</html>


实际操作

进过各种尝试,终于,写好了前端拍照端接收

结果

前端代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>网页调取摄像头</title>
</head>
<script src="https://code.jquery.com/jquery-3.3.1.min.js"></script>
<style>
#capture{
position: absolute;
right: 190px;
bottom: -40px;

}
#video{
position: absolute;
right: 0;
top: 0;
}
#img{
position: absolute;
left: 0;
top: 0;
}
.auto{
position: absolute;
left: 50%;
top: 50%;
height: 320px;
margin-top: -160px;
}
#sure{
position: absolute;
left: 210px;
bottom: -40px;

}
button{
cursor: pointer;
margin: 0 auto;
border: 1px solid #f0f0f0;
background: #5CACEE;
color: #FFF;
width: 100px;
height: 36px;
line-height: 36px;
border-radius: 8px;
text-align: center;
/*禁止选择*/
-webkit-touch-callout: none; /* iOS Safari */
-webkit-user-select: none; /* Chrome/Safari/Opera */
-khtml-user-select: none; /* Konqueror */
-moz-user-select: none; /* Firefox */
-ms-user-select: none; /* Internet Explorer/Edge */
user-select: none; /* Non-prefixed version, currently not supported by any browser */
}

</style>
<body>
<div class="auto">
<video id="video" width="480" height="320" autoplay></video>
<canvas id="canvas" width="480" height="320" style="display: none;"></canvas>
<img src="./body_default.png" id="img" width="480" height="320" style="margin-left: 20px;">
<div>
<button id="capture" title="点击进行拍照">拍照</button>
</div>
<div>
<button id="sure" title="是否用这张图片进行验证">确认</button>
</div>
</div>


<script>
var file ,stream;
//访问用户媒体设备的兼容方法
function getUserMedia(constraints, success, error) {
if (navigator.mediaDevices.getUserMedia) {
//最新的标准API
navigator.mediaDevices.getUserMedia(constraints).then(success).catch(error);
} else if (navigator.webkitGetUserMedia) {
//webkit核心浏览器
navigator.webkitGetUserMedia(constraints,success, error)
} else if (navigator.mozGetUserMedia) {
//firfox浏览器
navigator.mozGetUserMedia(constraints, success, error);
} else if (navigator.getUserMedia) {
//旧版API
navigator.getUserMedia(constraints, success, error);
}
}

let video = document.getElementById('video');
let canvas = document.getElementById('canvas');
let context = canvas.getContext('2d');

function success(stream) {
//兼容webkit核心浏览器
let CompatibleURL = window.URL || window.webkitURL;
//将视频流设置为video元素的源
console.log(stream);
stream = stream;
//video.src = CompatibleURL.createObjectURL(stream);
video.srcObject = stream;
video.play();
}

function error(error) {
console.log(`访问用户媒体设备失败${error.name}, ${error.message}`);
}

if (navigator.mediaDevices.getUserMedia || navigator.getUserMedia || navigator.webkitGetUserMedia || navigator.mozGetUserMedia) {
//调用用户媒体设备, 访问摄像头
getUserMedia({video : {width: 480, height: 320}}, success, error);
} else {
alert('不支持访问用户媒体');
}
// base64转文件

document.getElementById('capture').addEventListener('click', function () {
context.drawImage(video, 0, 0, 480, 320);
// 获取图片base64链接
var image = canvas.toDataURL('image/png');
// 定义一个img
var img = document.getElementById("img");
//设置属性和src
//img.id = "imgBoxxx";
img.src = image;
//将图片添加到页面中
//document.body.appendChild(img);
function dataURLtoFile(dataurl, filename) {
var arr = dataurl.split(','), mime = arr[0].match(/:(.*?);/)[1],
bstr = atob(arr[1]), n = bstr.length, u8arr = new Uint8Array(n);
while (n--) {
u8arr[n] = bstr.charCodeAt(n);
}
file = new File([u8arr], filename, {type: mime});
console.log(file)
return new File([u8arr], filename, {type: mime});
}
console.log(dataURLtoFile(image, "aa.png"));
})

document.getElementById("sure").addEventListener("click", function () {
var formData = new FormData();
console.log(file)
formData.append("file",file);
$.ajax({
type: "post",
//后端需要调用的地址
url:"http://localhost:8089/plotform/areFace.do",
data:formData, //发送数据
async: true, // 是否异步
processData: false, //processData 默认为false,当设置为true的时候,jquery ajax 提交的时候不会序列化 data,而是直接使用data
contentType: false,
success:function(data){
if(data.code === 200){
console.log(`${data.message}`);
}else{
console.log(`${data.message}`);
}
},
error:function(e){
self.$message.warning(`${e}`);
//console.log("不成功"+e);
}
});
stream.getTracks()[0].stop();//结束关闭流
})
</script>
</body>
</html>


后端代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
package com.dwx.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartHttpServletRequest;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

@Controller
public class areFaceController {

@RequestMapping(value = "/areFace.do")
@ResponseBody
public String areFaceTest(HttpServletRequest request,HttpServletRequest response,HttpSession session) {
MultipartHttpServletRequest multipartRequest=(MultipartHttpServletRequest) request;
return "sxt";
}

}

注意,这里需要在springmvc.xml中添加一个bean配置否则会出错

1
2
3
4
5
6
7
8
<!--在SpringMvc.xml文件中增加Spring文件上传的解析器-->
<bean id="multipartResolver"
class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="maxUploadSize" value="10485760" />
<!-- resolveLazily属性启用是为了推迟文件解析,以便在Action 中捕获文件大小异常 -->
<property name="resolveLazily" value="true" />
<property name="defaultEncoding" value="UTF-8" />
</bean>

人脸识别深入认识

人脸识别系统再认识

本次试验,希望能够学习到类似人脸打卡系统,通过一张静态图片可以从数据库中调出该人物的身份。

理论支持

在第一次的学习中,我发现了SDK提到了一个对象“feature”,里边可能存在人脸部信息的数据

根据上次的学习———-搭建一个项目

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
package dwx;

import com.arcsoft.face.ActiveFileInfo;
import com.arcsoft.face.EngineConfiguration;
import com.arcsoft.face.FaceEngine;
import com.arcsoft.face.FunctionConfiguration;
import com.arcsoft.face.enums.DetectMode;
import com.arcsoft.face.enums.DetectOrient;
import com.arcsoft.face.enums.ErrorInfo;
import com.arcsoft.face.toolkit.ImageInfo;

import java.io.File;

import static com.arcsoft.face.toolkit.ImageFactory.getRGBData;

public class MyAreFaceTest {

public static void main(String[] args) {

//启动引擎
String appId = "7K7KG9zfBVXbxoG3cxqKmpF1DwijXxJ73s75v7uZqxoT";
String sdkKey = "AuyJJAcGDtzSnK8wz2Dekrk28QmK1BnD5wXzSEPtXs5C";

//启动引擎的地址
String dllAddress = "D:\\AreFace\\libs\\WIN64";
FaceEngine faceEngine = new FaceEngine(dllAddress);

int errorCode = faceEngine.activeOnline(appId, sdkKey);


if (errorCode != ErrorInfo.MOK.getValue() && errorCode != ErrorInfo.MERR_ASF_ALREADY_ACTIVATED.getValue()) {
System.out.println("引擎激活失败");
}

ActiveFileInfo activeFileInfo = new ActiveFileInfo();

errorCode = faceEngine.getActiveFileInfo(activeFileInfo);

if (errorCode != ErrorInfo.MOK.getValue() && errorCode != ErrorInfo.MERR_ASF_ALREADY_ACTIVATED.getValue()) {
System.out.println("获取激活文件信息失败");
}

//初始化引擎
EngineConfiguration engineConfiguration = new EngineConfiguration();

//检测模式设置
//这里因为我们是对图片进行人脸识别,因此这里我们使用一个IMAGE模式
engineConfiguration.setDetectMode(DetectMode.ASF_DETECT_MODE_IMAGE);

//可检测图片人脸方向设置
engineConfiguration.setDetectFaceOrientPriority(DetectOrient.ASF_OP_ALL_OUT);//这里我设置的是全方位角设置
engineConfiguration.setDetectFaceMaxNum(40);//最大识别人脸数量
engineConfiguration.setDetectFaceScaleVal(16);//识别等级

//设置引擎功能
//功能配置,可以设置面容识别时是否分析年龄、性别、3d等。
FunctionConfiguration functionConfiguration = new FunctionConfiguration();
functionConfiguration.setSupportAge(true);
functionConfiguration.setSupportFace3dAngle(true);
functionConfiguration.setSupportFaceDetect(true);
functionConfiguration.setSupportFaceRecognition(true);
functionConfiguration.setSupportGender(true);
functionConfiguration.setSupportLiveness(true);
functionConfiguration.setSupportIRLiveness(true);

engineConfiguration.setFunctionConfiguration(functionConfiguration);


//初始化引擎 (将配置设置到引擎中)
errorCode = faceEngine.init(engineConfiguration);

if (errorCode != ErrorInfo.MOK.getValue()) {
System.out.println("引擎初始化失败");
}


//关闭引擎
faceEngine.unInit();
System.out.println("=================程序结束===================");

}
}

提取图片中的信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
//图片所在的文件路径
String fileUrl = "D:\\AreFace\\AreFaceTest\\";
//文件名称
String fileName = "aaa.jpg";
File file1 = new File(fileUrl + fileName);
ImageInfo imageInfo = getRGBData(file1);
//获得一个图片里的所有人脸信息
List<FaceInfo> faceInfos = new ArrayList<>();

faceEngine.detectFaces(imageInfo.getImageData(), imageInfo.getWidth(),imageInfo.getHeight() ,imageInfo.getImageFormat(),faceInfos);

//展示所有的人脸信息
for (FaceInfo faceInfo : faceInfos) {
System.out.println(faceInfo);
}



//获得feature
FaceFeature faceFeature = new FaceFeature();
faceEngine.extractFaceFeature(imageInfo.getImageData(), imageInfo.getWidth(),imageInfo.getHeight() ,imageInfo.getImageFormat(),faceInfos.get(0),faceFeature);

//输出特征值
System.out.println("feature数据位:"+ Arrays.toString(faceFeature.getFeatureData()));


获得的数据不知道是什么意思

1
2
feature数据位:[0, -128, -6, 68, 0, 0, -96, 65, -68, -21, 67, 61, -114, -43, 119, -68, -121, 0, -42, 61, 4, 7, -46, -68, 42, -1, -110, 61, -69, -114, -91, -67, 49, -60, 8, 60, 71, 71, -41, -67, -102, -119, 71, 57, 108, -77, -59, 61, 115, -20, 4, -67, 112, -28, 30, 58, -64, 48, 110, -67, 119, 84, -31, 61, 34, 96, -92, -67, 119, -3, -65, 61, 5, 123, -124, 61, 101, -97, 117, -67, -79, 53, 35, 61, -76, -124, -114, 61, -32, 85, 114, 60, 95, -89, -52, -67, 36, 93, 90, -67, -121, -20, -109, -68, -55, -91, 16, 61, -75, -64, 120, 59, 95, -80, -54, -67, -109, -92, 32, -67, 53, -99, 0, -67, -92, 74, -118, 61, 12, 97, -65, 60, -5, -60, 61, 60, 55, 111, -58, -67, 81, 36, 53, -68, 35, 114, 15, -68, 66, 100, -25, -68, -75, -118, -109, -67, 98, -12, -74, 58, 67, 13, 28, -67, -61, -65, 4, -67, 82, -8, 67, 60, -14, -58, -102, -67, -110, -32, -84, 61, 9, -110, 36, 62, 91, -81, 30, 61, 52, -77, 3, -67, -121, 29, 78, 61, -83, 70, -92, 61, 77, -71, 26, -66, -89, -59, -18, -68, 32, -115, -113, 61, 113, 61, 48, 61, 29, 121, -104, 61, -128, 21, -42, -68, -109, 97, -61, -68, -123, 121, -128, 60, 54, -72, 41, -67, 3, 37, -55, 61, -67, -59, 8, 61, 89, 126, -125, 60, -43, 30, 9, 59, -81, 51, -110, -67, -4, -94, -84, -68, -47, 109, -38, -70, -50, -64, -70, 60, -50, 60, 30, -68, 36, 84, -62, -67, 6, 3, 14, 61, 20, -47, -119, -67, -7, 5, 126, 60, 45, 96, 45, -67, -127, -124, -72, -69, -59, -112, -77, 61, -83, 79, 36, -66, -87, -77, -30, 61, -16, -107, -90, -67, 27, -36, 116, -68, -65, 114, -105, -67, -93, 60, 6, -67, -20, -64, -125, -67, -81, 24, -72, -67, 19, -124, 35, -67, -22, 16, -126, 61, -46, 115, 107, 61, 77, 20, -40, -67, -27, 35, 90, -67, 78, -2, -65, 59, 68, -31, -128, 61, 58, -60, -99, -68, -127, -48, -76, -67, 83, -8, -108, -69, 12, -115, -89, -69, 95, 107, 116, -67, -95, -84, 109, -69, 69, 34, 22, 61, 79, -121, -71, -67, -36, -121, 61, 61, 113, -98, 48, -67, -13, 65, -47, -67, -48, 123, -1, -67, -127, -6, 60, -67, 44, 126, -50, -71, 18, -78, 10, -67, 98, -51, -116, -69, 90, -92, 50, 61, -30, 115, 41, -67, -99, -26, -104, 61, 48, -82, -18, 61, 48, -104, 39, -66, -63, 35, 13, -69, 67, 60, -105, -67, -85, -38, 15, 61, -73, 4, -101, 60, -124, 16, -43, 61, -37, 114, 77, 60, -106, 9, -120, 61, -113, -26, 78, -69, -127, 26, 32, 62, -62, -77, -80, 61, -115, -86, 105, 61, -61, 22, 38, 61, 62, -19, -48, -68, -55, 36, 58, -67, 21, -77, -70, 60, 73, -41, -101, 59, -34, 14, -110, -67, -94, 124, 46, 61, 111, -12, 11, 61, 82, 99, -10, 58, -103, -84, -99, 61, 76, -70, -94, 61, -18, -79, 100, 59, -46, -22, 59, 61, -23, 26, -42, -67, 112, 102, 78, 60, -50, -79, 76, -67, -117, 70, -27, -70, 100, 35, -37, -67, -81, -98, 42, -67, 100, 18, 127, -67, 89, -28, -48, 61, -60, 72, -50, 61, 16, 22, 62, 61, 116, 104, 75, 61, 23, 75, 18, 61, 18, -17, -118, -68, 92, 47, 70, -67, 93, -97, 40, -67, 31, 50, 94, -68, -96, -6, -106, -67, -39, 90, 85, 59, 61, 116, 94, 61, -114, 75, 35, 61, 116, 30, 123, -67, -99, 60, -64, -68, 16, 120, -80, -67, 105, -9, 25, -66, 62, 49, 3, -66, -52, 11, 17, 59, 63, 87, 76, -68, 34, -102, 51, -68, 20, -91, -97, -67, 103, 18, -85, 60, 94, -8, 104, 58, 28, 75, -76, 61, -41, -121, -29, -67, 46, 27, -3, 60, 122, -95, -63, -67, 5, 39, 89, 61, -18, 72, -18, 58, 124, -51, -125, 58, -3, -47, 27, -68, 49, 94, 99, 61, 100, 54, -34, 61, 114, -106, 62, 61, 15, -34, 57, 59, -101, -8, 76, 60, 20, -70, -55, 59, 124, 42, 58, -67, 47, 38, 2, 61, -37, -24, -67, 61, 69, -35, -128, 61, 54, 17, 115, -68, -100, 110, -93, 60, -57, 116, -12, -67, 34, 48, 70, 61, -78, -16, 21, -68, 50, -19, -15, 60, -28, 3, 117, -67, -76, -124, -73, 60, -2, 46, -82, -69, 55, -105, 126, -67, -65, -120, -82, 61, -42, 108, 107, -68, -101, -48, -111, -67, -95, -22, 114, -67, -31, 127, 97, 61, 93, -122, -87, -67, 76, -5, -76, -68, 99, 12, 113, -68, -2, -5, 79, -68, 79, -17, 8, -67, 3, 89, -44, -68, 50, -120, -112, 61, -115, 20, 11, 60, 124, -118, 47, 61, 110, 111, 105, -67, 122, -15, 4, 62, 67, 64, -97, 60, -44, 85, -79, 60, 105, 40, 100, 61, 122, -95, 118, -67, 12, -99, -83, -67, -96, 94, -115, 60, -75, -39, -109, 61, -7, 79, -29, 61, -125, -79, -126, 61, -126, -77, 102, -67, -1, -7, -76, -67, -66, -30, 44, -67, 4, -91, -45, 61, -66, -36, 59, -67, -31, 120, 47, -67, 80, 63, -116, -67, 108, -74, -38, -67, -127, 51, -13, 61, 109, 111, -111, 61, -87, 106, -116, -67, -111, -91, 91, -67, -23, 120, -118, -67, -48, -34, 114, 60, -99, -124, 25, 59, 94, 44, -77, -68, 17, 12, -77, -68, 27, 108, 65, 61, 85, 12, 40, 60, -79, -63, 4, 61, 65, -79, -55, -67, -79, -23, -46, 61, 1, -122, -106, -68, -84, 40, -44, -67, 83, -24, 99, -67, 20, 37, -81, 61, -59, 84, -67, -70, -86, 74, -1, 60, -50, -118, 11, -68, -31, -16, -39, -68, -92, -64, -92, -68, -125, 12, -128, -67, -125, -72, -17, 60, -118, 41, 49, -67, 18, 78, 121, 61, 95, -31, -48, 60, 63, 113, -108, -68, 126, -13, 99, 61, 35, 21, 72, 58]

继续分析其他的图片的feature来获得这个数据的意义

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
//获得第二张图片的人脸数据
String fileName2 = "bbb.jpg";
File file2 = new File(fileUrl + fileName2);

ImageInfo imageInfo1 = getRGBData(file2);

ArrayList<FaceInfo> faceInfos1 = new ArrayList<>();

faceEngine.detectFaces(imageInfo1.getImageData(), imageInfo.getWidth(),imageInfo1.getHeight(),imageInfo1.getImageFormat(),faceInfos1);

for (FaceInfo faceInfo : faceInfos1) {
System.out.println(faceInfo);
}

FaceFeature faceFeature1 = new FaceFeature();
faceEngine.extractFaceFeature(imageInfo1.getImageData(), imageInfo.getWidth(),imageInfo1.getHeight(),imageInfo1.getImageFormat(),faceInfos1.get(0),faceFeature1);

//输出第二正图片的feature
System.out.println(Arrays.toString(faceFeature1.getFeatureData()));

1
[0, -128, -6, 68, 0, 0, -96, 65, 11, -80, -119, 61, -75, -91, 56, -69, 6, 119, 23, 62, -14, 33, -43, -67, -35, -127, 45, -68, -104, -2, 82, -67, -68, -121, 91, -68, 102, 92, -93, -67, 52, 9, -123, -67, -125, -37, 95, 61, -6, 103, 40, -67, 33, 115, 50, -68, -37, 28, -34, -67, -61, 100, -76, 61, -40, -54, -85, -67, -104, 107, -50, 61, 46, -52, -116, 61, -21, -53, -78, -67, 26, 19, -34, 61, -104, -53, -96, 61, -82, -64, -95, 60, -4, -55, -67, -67, 120, -89, 106, -67, -37, 72, -17, -68, -16, -19, -55, 60, 30, 123, -19, 61, 119, -28, -63, -67, 53, -90, -72, -67, -2, -32, -6, 60, 96, -69, -67, 61, -61, -64, 48, 61, -9, -123, -117, -68, 75, -106, 41, -67, 70, 107, -21, 60, 60, 116, 37, -67, -3, -124, 6, -70, -8, 66, -20, -69, -39, 75, 108, -68, -27, 103, -72, -67, -17, 73, 73, -67, 37, 114, 64, 61, 26, 25, -80, -67, -90, -71, 97, 61, -28, -77, -20, 61, 66, -111, -59, -70, -98, -6, -88, -68, 119, -42, -37, 60, 37, -92, -90, 60, -50, -94, 39, -66, 0, -69, -107, -68, -13, 64, -42, 61, 60, -103, -121, 61, 106, 118, -1, 61, 60, -82, -127, -67, -69, 21, -84, -68, 14, -2, 18, 61, 22, -36, 0, -68, 71, -33, -62, 61, 123, 21, -55, 60, -126, -60, 41, 61, -124, -79, -60, -71, 65, 85, -93, -67, 48, 105, -101, 59, -116, 118, -42, -68, -39, -54, -84, 59, -28, 33, 73, 61, 79, -71, -9, -67, 6, -66, 65, 61, -79, -66, -8, -67, -99, -42, -123, 61, 27, 61, 50, -67, -118, -89, 41, 61, -90, 76, -2, 61, 78, 107, 35, -66, 57, 80, -107, 61, -124, 77, 30, -67, 82, -25, 123, -67, 1, -85, -105, -67, 66, -29, 54, 60, -39, 77, -65, -69, 64, -89, -29, -68, 78, 77, 56, -67, -8, -82, -98, 60, 83, 51, 115, 61, 37, -62, 27, -67, 70, -89, -122, -67, 0, 14, -43, -68, -7, -71, 15, 62, 5, -26, 53, 60, 74, -19, -58, -67, 52, -22, 2, 61, 89, -18, -36, -69, -77, 86, 82, -67, -36, -81, 52, 60, 49, -115, 124, 61, -30, 116, -62, -67, 29, 116, 25, 61, -20, -47, 43, -67, -10, -120, 3, -66, -38, -28, 0, -66, 67, 78, 42, -67, -75, 83, -32, -68, -102, 87, -97, -67, -112, -81, 80, 59, -76, -39, 94, 61, 66, 106, 16, -67, 1, -104, 37, 60, -105, 84, -36, 61, -78, -76, -37, -67, 60, 0, 84, 58, -82, -76, -112, -67, -105, -18, 25, 61, -18, 94, -120, -68, 84, 35, -69, 61, 15, 36, -128, -69, 103, 122, 54, 60, -98, 30, -123, 61, 34, 125, 13, 62, -2, -60, -123, 61, 6, 49, -121, 61, -93, 25, -71, 60, 31, -124, 109, -67, -24, 97, 75, -67, 26, 40, -117, 61, 102, 36, -107, 61, -39, 87, 100, -67, 64, -64, 18, 61, -87, 110, -126, 60, -62, -24, 15, -67, -122, 106, -127, 61, 35, -4, -51, 61, -40, -81, 55, -67, -111, -5, 43, -68, 65, -51, 2, -66, -13, 60, 45, 61, -108, -109, -6, -68, -73, 53, 21, -67, -68, 36, -58, -67, -112, -83, 1, 61, -98, 45, -5, -67, -61, -59, -63, 61, 82, -107, 27, 61, -20, 2, -109, 61, -37, 56, 26, -67, 106, -119, -33, -68, -7, 75, -14, 58, 64, -76, 3, -67, 41, -35, 38, -67, -51, -24, 60, -68, 44, 67, 11, -67, 87, 103, 108, 60, -12, -5, 84, 61, -2, 70, 48, 61, -54, 41, -67, -68, 16, 107, -85, -68, -21, -29, -14, -67, 61, -107, 6, -66, -56, -74, -40, -67, -77, 30, -17, -68, -61, -56, -85, 60, -79, 81, -120, -67, -5, -45, 108, -67, 102, -54, -71, 60, 82, 62, 4, 61, -107, -12, 80, 61, 93, 20, -99, -68, -92, 104, 97, 59, -24, -76, 5, -67, -29, -13, 44, 61, -95, -93, -44, -68, 82, -108, 25, -67, -101, 93, 53, 60, -119, -59, 11, 61, 11, 67, -38, 60, 93, -107, -123, 60, 9, -18, 29, -67, -24, -33, -84, 61, 5, -47, -116, -67, 38, -97, -62, -67, 101, -26, 30, 60, -79, 85, -66, 61, -64, 76, -8, 60, -110, -112, -126, 58, 32, -5, -1, 59, -67, -105, 15, -66, -126, -23, -77, 61, -95, -37, 33, 60, -44, -80, -9, -69, -59, -15, -101, -67, 52, -27, -82, 60, 94, 100, 6, -68, -58, -79, 114, -68, -109, 16, 48, 61, -94, -106, 0, -67, 86, -42, -22, -68, -96, 107, -92, -67, -86, 121, 64, 61, -120, -75, -63, -67, -105, -92, 85, -67, 93, 120, 34, -67, -54, 12, -28, -68, 23, 43, 16, -67, -120, 89, 47, -68, 56, 126, 15, 62, -18, 42, -99, 60, -11, 52, 28, 61, -84, 123, 118, -67, 117, 36, 16, 62, -59, 28, -61, 61, -95, 122, 102, 61, 60, 38, -99, 61, -38, -80, 32, -68, 118, 69, -65, -67, -7, -33, 9, 61, 9, 36, -13, 61, -61, -87, -66, 61, 112, 114, -124, 61, 29, 112, -111, -67, -39, 91, 0, -66, 121, -38, -55, -67, -63, 11, 4, 61, -51, 89, -115, -67, 28, -74, 58, 60, 14, 122, -105, -67, 84, 108, 5, -66, -91, 35, -41, 61, 100, 13, -38, 61, -33, 125, 85, -68, 93, 25, -111, -67, 107, -30, 37, -67, 63, -117, 57, 60, -1, 68, 48, 61, -115, 5, -120, 61, -26, 50, -103, 60, -60, 39, -122, 61, 84, 117, -71, -69, 29, 98, 110, 61, 54, 108, -67, -67, -115, -125, -111, 61, -117, 91, -99, 60, 68, -79, -112, -67, 16, -67, -122, -68, 62, -26, -8, 60, -57, 79, 105, -68, 7, 8, 48, -67, 41, 9, 123, 61, -29, -61, -97, -69, -95, 84, 114, -67, -45, 11, -6, -68, -90, -107, -90, -68, 119, -122, 82, -67, -58, -71, -122, 60, -42, -102, 120, 60, 56, 58, 105, -67, 32, -99, -49, 61, -67, 108, 56, 60]

不明白feature,但是这个东西可以存储

程序源码

xWv9Xj.png

源码说存储的是byte形式

构造器张这个样子 只有一个byte[]数组

xWv9Xj.png

xWvUjH.png

也可以这样创建

xWvdud.png

因此我们可以知道

我们可以获得一个对比图片的feature的人脸数据,一个byte[],我们可以将它转为String类型存储在数据库中,

然后如果需要人脸对比,从数据库中得到这个String,转换成byte[]再整合成一个feature对象

尝试一下这种方法

存储数据 即将超长数据存入String 从超长String获得byte[]中的方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
String data;
data = "0, -128, -6, 68, 0, 0, -96, 65, 11, -80, -119, 61, -75, -91, 56, -69, 6, 119, 23, 62, -14, 33, -43, -67, -35, -127, 45, -68, -104, -2, 82, -67, -68, -121, 91, -68, 102, 92, -93, -67, 52, 9, -123, -67, -125, -37, 95, 61, -6, 103, 40, -67, 33, 115, 50, -68, -37, 28, -34, -67, -61, 100, -76, 61, -40, -54, -85, -67, -104, 107, -50, 61, 46, -52, -116, 61, -21, -53, -78, -67, 26, 19, -34, 61, -104, -53, -96, 61, -82, -64, -95, 60, -4, -55, -67, -67, 120, -89, 106, -67, -37, 72, -17, -68, -16, -19, -55, 60, 30, 123, -19, 61, 119, -28, -63, -67, 53, -90, -72, -67, -2, -32, -6, 60, 96, -69, -67, 61, -61, -64, 48, 61, -9, -123, -117, -68, 75, -106, 41, -67, 70, 107, -21, 60, 60, 116, 37, -67, -3, -124, 6, -70, -8, 66, -20, -69, -39, 75, 108, -68, -27, 103, -72, -67, -17, 73, 73, -67, 37, 114, 64, 61, 26, 25, -80, -67, -90, -71, 97, 61, -28, -77, -20, 61, 66, -111, -59, -70, -98, -6, -88, -68, 119, -42, -37, 60, 37, -92, -90, 60, -50, -94, 39, -66, 0, -69, -107, -68, -13, 64, -42, 61, 60, -103, -121, 61, 106, 118, -1, 61, 60, -82, -127, -67, -69, 21, -84, -68, 14, -2, 18, 61, 22, -36, 0, -68, 71, -33, -62, 61, 123, 21, -55, 60, -126, -60, 41, 61, -124, -79, -60, -71, 65, 85, -93, -67, 48, 105, -101, 59, -116, 118, -42, -68, -39, -54, -84, 59, -28, 33, 73, 61, 79, -71, -9, -67, 6, -66, 65, 61, -79, -66, -8, -67, -99, -42, -123, 61, 27, 61, 50, -67, -118, -89, 41, 61, -90, 76, -2, 61, 78, 107, 35, -66, 57, 80, -107, 61, -124, 77, 30, -67, 82, -25, 123, -67, 1, -85, -105, -67, 66, -29, 54, 60, -39, 77, -65, -69, 64, -89, -29, -68, 78, 77, 56, -67, -8, -82, -98, 60, 83, 51, 115, 61, 37, -62, 27, -67, 70, -89, -122, -67, 0, 14, -43, -68, -7, -71, 15, 62, 5, -26, 53, 60, 74, -19, -58, -67, 52, -22, 2, 61, 89, -18, -36, -69, -77, 86, 82, -67, -36, -81, 52, 60, 49, -115, 124, 61, -30, 116, -62, -67, 29, 116, 25, 61, -20, -47, 43, -67, -10, -120, 3, -66, -38, -28, 0, -66, 67, 78, 42, -67, -75, 83, -32, -68, -102, 87, -97, -67, -112, -81, 80, 59, -76, -39, 94, 61, 66, 106, 16, -67, 1, -104, 37, 60, -105, 84, -36, 61, -78, -76, -37, -67, 60, 0, 84, 58, -82, -76, -112, -67, -105, -18, 25, 61, -18, 94, -120, -68, 84, 35, -69, 61, 15, 36, -128, -69, 103, 122, 54, 60, -98, 30, -123, 61, 34, 125, 13, 62, -2, -60, -123, 61, 6, 49, -121, 61, -93, 25, -71, 60, 31, -124, 109, -67, -24, 97, 75, -67, 26, 40, -117, 61, 102, 36, -107, 61, -39, 87, 100, -67, 64, -64, 18, 61, -87, 110, -126, 60, -62, -24, 15, -67, -122, 106, -127, 61, 35, -4, -51, 61, -40, -81, 55, -67, -111, -5, 43, -68, 65, -51, 2, -66, -13, 60, 45, 61, -108, -109, -6, -68, -73, 53, 21, -67, -68, 36, -58, -67, -112, -83, 1, 61, -98, 45, -5, -67, -61, -59, -63, 61, 82, -107, 27, 61, -20, 2, -109, 61, -37, 56, 26, -67, 106, -119, -33, -68, -7, 75, -14, 58, 64, -76, 3, -67, 41, -35, 38, -67, -51, -24, 60, -68, 44, 67, 11, -67, 87, 103, 108, 60, -12, -5, 84, 61, -2, 70, 48, 61, -54, 41, -67, -68, 16, 107, -85, -68, -21, -29, -14, -67, 61, -107, 6, -66, -56, -74, -40, -67, -77, 30, -17, -68, -61, -56, -85, 60, -79, 81, -120, -67, -5, -45, 108, -67, 102, -54, -71, 60, 82, 62, 4, 61, -107, -12, 80, 61, 93, 20, -99, -68, -92, 104, 97, 59, -24, -76, 5, -67, -29, -13, 44, 61, -95, -93, -44, -68, 82, -108, 25, -67, -101, 93, 53, 60, -119, -59, 11, 61, 11, 67, -38, 60, 93, -107, -123, 60, 9, -18, 29, -67, -24, -33, -84, 61, 5, -47, -116, -67, 38, -97, -62, -67, 101, -26, 30, 60, -79, 85, -66, 61, -64, 76, -8, 60, -110, -112, -126, 58, 32, -5, -1, 59, -67, -105, 15, -66, -126, -23, -77, 61, -95, -37, 33, 60, -44, -80, -9, -69, -59, -15, -101, -67, 52, -27, -82, 60, 94, 100, 6, -68, -58, -79, 114, -68, -109, 16, 48, 61, -94, -106, 0, -67, 86, -42, -22, -68, -96, 107, -92, -67, -86, 121, 64, 61, -120, -75, -63, -67, -105, -92, 85, -67, 93, 120, 34, -67, -54, 12, -28, -68, 23, 43, 16, -67, -120, 89, 47, -68, 56, 126, 15, 62, -18, 42, -99, 60, -11, 52, 28, 61, -84, 123, 118, -67, 117, 36, 16, 62, -59, 28, -61, 61, -95, 122, 102, 61, 60, 38, -99, 61, -38, -80, 32, -68, 118, 69, -65, -67, -7, -33, 9, 61, 9, 36, -13, 61, -61, -87, -66, 61, 112, 114, -124, 61, 29, 112, -111, -67, -39, 91, 0, -66, 121, -38, -55, -67, -63, 11, 4, 61, -51, 89, -115, -67, 28, -74, 58, 60, 14, 122, -105, -67, 84, 108, 5, -66, -91, 35, -41, 61, 100, 13, -38, 61, -33, 125, 85, -68, 93, 25, -111, -67, 107, -30, 37, -67, 63, -117, 57, 60, -1, 68, 48, 61, -115, 5, -120, 61, -26, 50, -103, 60, -60, 39, -122, 61, 84, 117, -71, -69, 29, 98, 110, 61, 54, 108, -67, -67, -115, -125, -111, 61, -117, 91, -99, 60, 68, -79, -112, -67, 16, -67, -122, -68, 62, -26, -8, 60, -57, 79, 105, -68, 7, 8, 48, -67, 41, 9, 123, 61, -29, -61, -97, -69, -95, 84, 114, -67, -45, 11, -6, -68, -90, -107, -90, -68, 119, -122, 82, -67, -58, -71, -122, 60, -42, -102, 120, 60, 56, 58, 105, -67, 32, -99, -49, 61, -67, 108, 56, 60";

String[] test01 = data.split(", ");
System.out.println("===============原始数据====================");
System.out.println(Arrays.toString(test01));


//对byte[]进行赋值
int size = test01.length;
byte[] demo = new byte[size];

for (int i=0;i<size;i++){
demo[i] = Byte.parseByte(test01[i]);
}

System.out.println("================存放好的数据==================");
System.out.println(Arrays.toString(demo));

结果

1
2
3
4
5
===============原始数据====================
[0, -128, -6, 68, 0, 0, -96, 65, 11, -80, -119, 61, -75, -91, 56, -69, 6, 119, 23, 62, -14, 33, -43, -67, -35, -127, 45, -68, -104, -2, 82, -67, -68, -121, 91, -68, 102, 92, -93, -67, 52, 9, -123, -67, -125, -37, 95, 61, -6, 103, 40, -67, 33, 115, 50, -68, -37, 28, -34, -67, -61, 100, -76, 61, -40, -54, -85, -67, -104, 107, -50, 61, 46, -52, -116, 61, -21, -53, -78, -67, 26, 19, -34, 61, -104, -53, -96, 61, -82, -64, -95, 60, -4, -55, -67, -67, 120, -89, 106, -67, -37, 72, -17, -68, -16, -19, -55, 60, 30, 123, -19, 61, 119, -28, -63, -67, 53, -90, -72, -67, -2, -32, -6, 60, 96, -69, -67, 61, -61, -64, 48, 61, -9, -123, -117, -68, 75, -106, 41, -67, 70, 107, -21, 60, 60, 116, 37, -67, -3, -124, 6, -70, -8, 66, -20, -69, -39, 75, 108, -68, -27, 103, -72, -67, -17, 73, 73, -67, 37, 114, 64, 61, 26, 25, -80, -67, -90, -71, 97, 61, -28, -77, -20, 61, 66, -111, -59, -70, -98, -6, -88, -68, 119, -42, -37, 60, 37, -92, -90, 60, -50, -94, 39, -66, 0, -69, -107, -68, -13, 64, -42, 61, 60, -103, -121, 61, 106, 118, -1, 61, 60, -82, -127, -67, -69, 21, -84, -68, 14, -2, 18, 61, 22, -36, 0, -68, 71, -33, -62, 61, 123, 21, -55, 60, -126, -60, 41, 61, -124, -79, -60, -71, 65, 85, -93, -67, 48, 105, -101, 59, -116, 118, -42, -68, -39, -54, -84, 59, -28, 33, 73, 61, 79, -71, -9, -67, 6, -66, 65, 61, -79, -66, -8, -67, -99, -42, -123, 61, 27, 61, 50, -67, -118, -89, 41, 61, -90, 76, -2, 61, 78, 107, 35, -66, 57, 80, -107, 61, -124, 77, 30, -67, 82, -25, 123, -67, 1, -85, -105, -67, 66, -29, 54, 60, -39, 77, -65, -69, 64, -89, -29, -68, 78, 77, 56, -67, -8, -82, -98, 60, 83, 51, 115, 61, 37, -62, 27, -67, 70, -89, -122, -67, 0, 14, -43, -68, -7, -71, 15, 62, 5, -26, 53, 60, 74, -19, -58, -67, 52, -22, 2, 61, 89, -18, -36, -69, -77, 86, 82, -67, -36, -81, 52, 60, 49, -115, 124, 61, -30, 116, -62, -67, 29, 116, 25, 61, -20, -47, 43, -67, -10, -120, 3, -66, -38, -28, 0, -66, 67, 78, 42, -67, -75, 83, -32, -68, -102, 87, -97, -67, -112, -81, 80, 59, -76, -39, 94, 61, 66, 106, 16, -67, 1, -104, 37, 60, -105, 84, -36, 61, -78, -76, -37, -67, 60, 0, 84, 58, -82, -76, -112, -67, -105, -18, 25, 61, -18, 94, -120, -68, 84, 35, -69, 61, 15, 36, -128, -69, 103, 122, 54, 60, -98, 30, -123, 61, 34, 125, 13, 62, -2, -60, -123, 61, 6, 49, -121, 61, -93, 25, -71, 60, 31, -124, 109, -67, -24, 97, 75, -67, 26, 40, -117, 61, 102, 36, -107, 61, -39, 87, 100, -67, 64, -64, 18, 61, -87, 110, -126, 60, -62, -24, 15, -67, -122, 106, -127, 61, 35, -4, -51, 61, -40, -81, 55, -67, -111, -5, 43, -68, 65, -51, 2, -66, -13, 60, 45, 61, -108, -109, -6, -68, -73, 53, 21, -67, -68, 36, -58, -67, -112, -83, 1, 61, -98, 45, -5, -67, -61, -59, -63, 61, 82, -107, 27, 61, -20, 2, -109, 61, -37, 56, 26, -67, 106, -119, -33, -68, -7, 75, -14, 58, 64, -76, 3, -67, 41, -35, 38, -67, -51, -24, 60, -68, 44, 67, 11, -67, 87, 103, 108, 60, -12, -5, 84, 61, -2, 70, 48, 61, -54, 41, -67, -68, 16, 107, -85, -68, -21, -29, -14, -67, 61, -107, 6, -66, -56, -74, -40, -67, -77, 30, -17, -68, -61, -56, -85, 60, -79, 81, -120, -67, -5, -45, 108, -67, 102, -54, -71, 60, 82, 62, 4, 61, -107, -12, 80, 61, 93, 20, -99, -68, -92, 104, 97, 59, -24, -76, 5, -67, -29, -13, 44, 61, -95, -93, -44, -68, 82, -108, 25, -67, -101, 93, 53, 60, -119, -59, 11, 61, 11, 67, -38, 60, 93, -107, -123, 60, 9, -18, 29, -67, -24, -33, -84, 61, 5, -47, -116, -67, 38, -97, -62, -67, 101, -26, 30, 60, -79, 85, -66, 61, -64, 76, -8, 60, -110, -112, -126, 58, 32, -5, -1, 59, -67, -105, 15, -66, -126, -23, -77, 61, -95, -37, 33, 60, -44, -80, -9, -69, -59, -15, -101, -67, 52, -27, -82, 60, 94, 100, 6, -68, -58, -79, 114, -68, -109, 16, 48, 61, -94, -106, 0, -67, 86, -42, -22, -68, -96, 107, -92, -67, -86, 121, 64, 61, -120, -75, -63, -67, -105, -92, 85, -67, 93, 120, 34, -67, -54, 12, -28, -68, 23, 43, 16, -67, -120, 89, 47, -68, 56, 126, 15, 62, -18, 42, -99, 60, -11, 52, 28, 61, -84, 123, 118, -67, 117, 36, 16, 62, -59, 28, -61, 61, -95, 122, 102, 61, 60, 38, -99, 61, -38, -80, 32, -68, 118, 69, -65, -67, -7, -33, 9, 61, 9, 36, -13, 61, -61, -87, -66, 61, 112, 114, -124, 61, 29, 112, -111, -67, -39, 91, 0, -66, 121, -38, -55, -67, -63, 11, 4, 61, -51, 89, -115, -67, 28, -74, 58, 60, 14, 122, -105, -67, 84, 108, 5, -66, -91, 35, -41, 61, 100, 13, -38, 61, -33, 125, 85, -68, 93, 25, -111, -67, 107, -30, 37, -67, 63, -117, 57, 60, -1, 68, 48, 61, -115, 5, -120, 61, -26, 50, -103, 60, -60, 39, -122, 61, 84, 117, -71, -69, 29, 98, 110, 61, 54, 108, -67, -67, -115, -125, -111, 61, -117, 91, -99, 60, 68, -79, -112, -67, 16, -67, -122, -68, 62, -26, -8, 60, -57, 79, 105, -68, 7, 8, 48, -67, 41, 9, 123, 61, -29, -61, -97, -69, -95, 84, 114, -67, -45, 11, -6, -68, -90, -107, -90, -68, 119, -122, 82, -67, -58, -71, -122, 60, -42, -102, 120, 60, 56, 58, 105, -67, 32, -99, -49, 61, -67, 108, 56, 60]
================存放好的数据==================
[0, -128, -6, 68, 0, 0, -96, 65, 11, -80, -119, 61, -75, -91, 56, -69, 6, 119, 23, 62, -14, 33, -43, -67, -35, -127, 45, -68, -104, -2, 82, -67, -68, -121, 91, -68, 102, 92, -93, -67, 52, 9, -123, -67, -125, -37, 95, 61, -6, 103, 40, -67, 33, 115, 50, -68, -37, 28, -34, -67, -61, 100, -76, 61, -40, -54, -85, -67, -104, 107, -50, 61, 46, -52, -116, 61, -21, -53, -78, -67, 26, 19, -34, 61, -104, -53, -96, 61, -82, -64, -95, 60, -4, -55, -67, -67, 120, -89, 106, -67, -37, 72, -17, -68, -16, -19, -55, 60, 30, 123, -19, 61, 119, -28, -63, -67, 53, -90, -72, -67, -2, -32, -6, 60, 96, -69, -67, 61, -61, -64, 48, 61, -9, -123, -117, -68, 75, -106, 41, -67, 70, 107, -21, 60, 60, 116, 37, -67, -3, -124, 6, -70, -8, 66, -20, -69, -39, 75, 108, -68, -27, 103, -72, -67, -17, 73, 73, -67, 37, 114, 64, 61, 26, 25, -80, -67, -90, -71, 97, 61, -28, -77, -20, 61, 66, -111, -59, -70, -98, -6, -88, -68, 119, -42, -37, 60, 37, -92, -90, 60, -50, -94, 39, -66, 0, -69, -107, -68, -13, 64, -42, 61, 60, -103, -121, 61, 106, 118, -1, 61, 60, -82, -127, -67, -69, 21, -84, -68, 14, -2, 18, 61, 22, -36, 0, -68, 71, -33, -62, 61, 123, 21, -55, 60, -126, -60, 41, 61, -124, -79, -60, -71, 65, 85, -93, -67, 48, 105, -101, 59, -116, 118, -42, -68, -39, -54, -84, 59, -28, 33, 73, 61, 79, -71, -9, -67, 6, -66, 65, 61, -79, -66, -8, -67, -99, -42, -123, 61, 27, 61, 50, -67, -118, -89, 41, 61, -90, 76, -2, 61, 78, 107, 35, -66, 57, 80, -107, 61, -124, 77, 30, -67, 82, -25, 123, -67, 1, -85, -105, -67, 66, -29, 54, 60, -39, 77, -65, -69, 64, -89, -29, -68, 78, 77, 56, -67, -8, -82, -98, 60, 83, 51, 115, 61, 37, -62, 27, -67, 70, -89, -122, -67, 0, 14, -43, -68, -7, -71, 15, 62, 5, -26, 53, 60, 74, -19, -58, -67, 52, -22, 2, 61, 89, -18, -36, -69, -77, 86, 82, -67, -36, -81, 52, 60, 49, -115, 124, 61, -30, 116, -62, -67, 29, 116, 25, 61, -20, -47, 43, -67, -10, -120, 3, -66, -38, -28, 0, -66, 67, 78, 42, -67, -75, 83, -32, -68, -102, 87, -97, -67, -112, -81, 80, 59, -76, -39, 94, 61, 66, 106, 16, -67, 1, -104, 37, 60, -105, 84, -36, 61, -78, -76, -37, -67, 60, 0, 84, 58, -82, -76, -112, -67, -105, -18, 25, 61, -18, 94, -120, -68, 84, 35, -69, 61, 15, 36, -128, -69, 103, 122, 54, 60, -98, 30, -123, 61, 34, 125, 13, 62, -2, -60, -123, 61, 6, 49, -121, 61, -93, 25, -71, 60, 31, -124, 109, -67, -24, 97, 75, -67, 26, 40, -117, 61, 102, 36, -107, 61, -39, 87, 100, -67, 64, -64, 18, 61, -87, 110, -126, 60, -62, -24, 15, -67, -122, 106, -127, 61, 35, -4, -51, 61, -40, -81, 55, -67, -111, -5, 43, -68, 65, -51, 2, -66, -13, 60, 45, 61, -108, -109, -6, -68, -73, 53, 21, -67, -68, 36, -58, -67, -112, -83, 1, 61, -98, 45, -5, -67, -61, -59, -63, 61, 82, -107, 27, 61, -20, 2, -109, 61, -37, 56, 26, -67, 106, -119, -33, -68, -7, 75, -14, 58, 64, -76, 3, -67, 41, -35, 38, -67, -51, -24, 60, -68, 44, 67, 11, -67, 87, 103, 108, 60, -12, -5, 84, 61, -2, 70, 48, 61, -54, 41, -67, -68, 16, 107, -85, -68, -21, -29, -14, -67, 61, -107, 6, -66, -56, -74, -40, -67, -77, 30, -17, -68, -61, -56, -85, 60, -79, 81, -120, -67, -5, -45, 108, -67, 102, -54, -71, 60, 82, 62, 4, 61, -107, -12, 80, 61, 93, 20, -99, -68, -92, 104, 97, 59, -24, -76, 5, -67, -29, -13, 44, 61, -95, -93, -44, -68, 82, -108, 25, -67, -101, 93, 53, 60, -119, -59, 11, 61, 11, 67, -38, 60, 93, -107, -123, 60, 9, -18, 29, -67, -24, -33, -84, 61, 5, -47, -116, -67, 38, -97, -62, -67, 101, -26, 30, 60, -79, 85, -66, 61, -64, 76, -8, 60, -110, -112, -126, 58, 32, -5, -1, 59, -67, -105, 15, -66, -126, -23, -77, 61, -95, -37, 33, 60, -44, -80, -9, -69, -59, -15, -101, -67, 52, -27, -82, 60, 94, 100, 6, -68, -58, -79, 114, -68, -109, 16, 48, 61, -94, -106, 0, -67, 86, -42, -22, -68, -96, 107, -92, -67, -86, 121, 64, 61, -120, -75, -63, -67, -105, -92, 85, -67, 93, 120, 34, -67, -54, 12, -28, -68, 23, 43, 16, -67, -120, 89, 47, -68, 56, 126, 15, 62, -18, 42, -99, 60, -11, 52, 28, 61, -84, 123, 118, -67, 117, 36, 16, 62, -59, 28, -61, 61, -95, 122, 102, 61, 60, 38, -99, 61, -38, -80, 32, -68, 118, 69, -65, -67, -7, -33, 9, 61, 9, 36, -13, 61, -61, -87, -66, 61, 112, 114, -124, 61, 29, 112, -111, -67, -39, 91, 0, -66, 121, -38, -55, -67, -63, 11, 4, 61, -51, 89, -115, -67, 28, -74, 58, 60, 14, 122, -105, -67, 84, 108, 5, -66, -91, 35, -41, 61, 100, 13, -38, 61, -33, 125, 85, -68, 93, 25, -111, -67, 107, -30, 37, -67, 63, -117, 57, 60, -1, 68, 48, 61, -115, 5, -120, 61, -26, 50, -103, 60, -60, 39, -122, 61, 84, 117, -71, -69, 29, 98, 110, 61, 54, 108, -67, -67, -115, -125, -111, 61, -117, 91, -99, 60, 68, -79, -112, -67, 16, -67, -122, -68, 62, -26, -8, 60, -57, 79, 105, -68, 7, 8, 48, -67, 41, 9, 123, 61, -29, -61, -97, -69, -95, 84, 114, -67, -45, 11, -6, -68, -90, -107, -90, -68, 119, -122, 82, -67, -58, -71, -122, 60, -42, -102, 120, 60, 56, 58, 105, -67, 32, -99, -49, 61, -67, 108, 56, 60]

获得对比图片的人信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
//初始化引擎
EngineConfiguration engineConfiguration = new EngineConfiguration();

//检测模式设置
//这里因为我们是对图片进行人脸识别,因此这里我们使用一个IMAGE模式
engineConfiguration.setDetectMode(DetectMode.ASF_DETECT_MODE_IMAGE);

//可检测图片人脸方向设置
engineConfiguration.setDetectFaceOrientPriority(DetectOrient.ASF_OP_ALL_OUT);//这里我设置的是全方位角设置
engineConfiguration.setDetectFaceMaxNum(40);//最大识别人脸数量
engineConfiguration.setDetectFaceScaleVal(16);//识别等级

//设置引擎功能
//功能配置,可以设置面容识别时是否分析年龄、性别、3d等。
FunctionConfiguration functionConfiguration = new FunctionConfiguration();
functionConfiguration.setSupportAge(true);
functionConfiguration.setSupportFace3dAngle(true);
functionConfiguration.setSupportFaceDetect(true);
functionConfiguration.setSupportFaceRecognition(true);
functionConfiguration.setSupportGender(true);
functionConfiguration.setSupportLiveness(true);
functionConfiguration.setSupportIRLiveness(true);

engineConfiguration.setFunctionConfiguration(functionConfiguration);


//初始化引擎 (将配置设置到引擎中)
errorCode = faceEngine.init(engineConfiguration);

if (errorCode != ErrorInfo.MOK.getValue()) {
System.out.println("引擎初始化失败");
}


System.out.println("=================以下是aaa.jpg的数据========================");

//图片所在的文件路径
String fileUrl = "D:\\AreFace\\AreFaceTest\\";
//文件名称
String fileName = "aaa.jpg";
File file1 = new File(fileUrl + fileName);
ImageInfo imageInfo = getRGBData(file1);
//获得一个图片里的所有人脸信息
List<FaceInfo> faceInfos = new ArrayList<>();

faceEngine.detectFaces(imageInfo.getImageData(), imageInfo.getWidth(),imageInfo.getHeight() ,imageInfo.getImageFormat(),faceInfos);



//获得feature
FaceFeature faceFeature1 = new FaceFeature();
faceEngine.extractFaceFeature(imageInfo.getImageData(), imageInfo.getWidth(),imageInfo.getHeight() ,imageInfo.getImageFormat(),faceInfos.get(0),faceFeature1);

//输出特征值
System.out.println(Arrays.toString(faceFeature1.getFeatureData()));

调用方法进行对比获得相似度

1
2
3
4
5
//调用程序 通过对比faceFeature 获得脸部信息的相似度
FaceSimilar faceSimilar = new FaceSimilar();
faceEngine.compareFaceFeature(faceFeature,faceFeature1,faceSimilar);
//输出相似度 大抵应该是1
System.out.println(faceSimilar.getScore());

这种方法的结果

xWvDEt.png

正常两张图片对比的结果

xWvrUP.png

一模一样 可以说是成功了

人脸识别类型

根据官网介绍,人脸识别大致可以分为两种

  • 你是谁 (一对多)
  • 你是不是照片上这个人(一对一)

对于“你是谁”问题

“你是谁”在我的想法里,是一个一对多的过程,很多人的照片faceFeature存储在一个数据库中,当有人上传了他的照片,到数据库中找数据,查找到相似度最高且超过阈值的人,认为是查找到的人。

阈值:即相似度,对于这个相似度的把控,我还没有查询到资料,不知道多少合适暂定为0.9

对于”是不是你”问题

这个问题很明显是一个一对一问题,而且很好操作,是一对多题的简化。

  • Copyrights © 2015-2023 dwx
  • Visitors: | Views:

请我喝杯咖啡吧~

支付宝
微信